Извлечь переменные с пробелами между ними для таблицы SQL с помощью sqlQuery RODBC - PullRequest
0 голосов
/ 30 апреля 2018

В моей таблице базы данных SQL Server есть одна переменная с пробелами. Я пытаюсь написать один запрос в функции RODBC::sqlQuery, но я не могу использовать эту переменную.

  • Я пытался использовать одинарные кавычки, но это не работает.
  • Я пытался использовать опцию paste и создать одну строку для запроса, но даже это тоже не сработало.

Следующий запрос:

p5 <-sqlQuery(con, 'SELECT
                      a.region,
                      a.Country,
                      a.Qtr_ID,
                      Net_VAT AS Variable_Type,
                      "Printing" AS [External_Segment],
                      SUM(a.VR_Value) AS Value
                    FROM 
                       (SELECT
                         d.region,
                         d.Country,
                         dt.Qtr_ID,
                         SUM([Actuals YTD] / 1000000) AS VR_Value
                       FROM ZOOM_DATAMART.dbo.[New_BalSheet_Fact] a
                       INNER JOIN [dbo].[Buss_Area_Dim_V] b
                         ON a.Bus_Area_ID = b.Bus_Area_ID
                         AND b."GBU External Segment Description" = "Printing"
                       INNER JOIN [dbo].[BSR_Header_GA_Dim_V] c
                         ON a.BSR_HEADER_GA_KEY = c.BSR_HEADER_GA_KEY
                         AND c.[Group Account Identifier] IN (1291, 2150, 2151, 
                                                              2152, 2153, 2154)
                       INNER JOIN [dbo].[Legal_Company_Dim_V] d
                         ON a.Legal_Cmp_Key = d.Legal_Cmp_Key
                       INNER JOIN dbo.Date_Dim dt
                         ON a.Date_key = dt.Date_key
                         AND dt.Max_month_Flag = 1
                       GROUP BY d.region,
                                dt.Qtr_ID,
                                d.Country
                       ) a
                    GROUP BY a.region,
                             a.Country,
                             a.Qtr_ID)

Проблема возникает с «Описание внешнего сегмента GBU». Я получаю следующую ошибку:

chr [1: 4] "42S22 207 [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Недопустимое имя столбца« Печать »." ...

Затем я удалил двойную кавычку из печати, но все еще для «Описание внешнего сегмента GBU» он не принимает и выдает следующую ошибку:

chr [1: 3] "42000 102 [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Неверный синтаксис рядом с« Описание внешнего сегмента GBU »." ...

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

В целом, ваша основная проблема связана с путаницей и путаницей идентификаторов и литералов . В качестве информации, в ANSI-SQL (формальном отраслевом стандарте языка SQL, которого придерживается большинство СУБД, включая SQL Server, Oracle, Postgres и т. Д.), Одинарные кавычки и двойные кавычки используются для различных целей.

Одинарные кавычки используются для включения строковых литералов в столбцы типа char, varchar, text, такие как 'Printing'. Ваше первое сообщение об ошибке фактически указывает на Печать , поскольку механизм MSSQL пытался найти имя столбца, поскольку вы заключили это значение в двойные кавычки.

Двойные кавычки используются для идентификаторов, включая имена столбцов и имена таблиц, такие как c."Group Account Identifier". Ваша вторая ошибка указывает на использование квалификации псевдонима таблицы, c, к буквальному значению, поскольку вы заключили это значение в одинарные кавычки.

Ниже приведены несколько распространенных случаев использования этого типа:

  • Двойные кавычки явно накладывают чувствительность к регистру. В частности, когда вы заключаете имена столбцов в двойные кавычки, одни и те же символы в верблюжьем, нижнем и верхнем регистре отображают разные значения, и возникает ошибка, если они не совпадают с фактическим регистром, использованным при создании таблицы (т. Е. * 1024). *).

  • Двойные кавычки помогают экранировать специальные символы (!@#$%^&*?) и пробелы. Следовательно, вы можете использовать c."Group Account Identifier" для идентификации столбца. Однако некоторые РСУБД имеют свои собственные экранирующие символы для специальных символов и пробелов, которые не являются стандартами ANSI. Например, SQL Server может использовать квадратные скобки [...]; MySQL может использовать backticks `...`; SQLite и MS Access могут использовать оба.

  • Двойные кавычки помогают избежать зарезервированных слов текущей СУБД, которая включает в себя список SQL Server . Однако не рекомендуется использовать такие слова, специальные символы, ударения или пробелы в именах столбцов.


С учетом сказанного, как и у любого правила, есть исключения. Оба типа кавычек могут использоваться со строковыми литералами для некоторых баз данных, которые допускают не-ANSI режимы. Однако это не рекомендуется делать на практике. В отличие от большинства языков программирования, таких как R, Python, PHP, Perl, XSLT, которые могут заменять эти два типа кавычек на строковые значения, SQL в его базовом ядре не является одним из них.


Поэтому используйте любой тип кавычек соответственно:

'Printing' AS "External_Segment",
...
AND b."GBU External Segment Description" = 'Printing'
...
AND c."Group Account Identifier" IN (1291, 2150, 2151, 2152, 2153, 2154)

Или

'Printing' AS [External_Segment],
...
AND b.[GBU External Segment Description] = 'Printing'
...
AND c.[Group Account Identifier] IN (1291, 2150, 2151, 2152, 2153, 2154)
0 голосов
/ 30 апреля 2018

Ошибка не с именем поля, которое я считаю, а с константой varchar, которую вы ищете. Вы должны использовать одинарные кавычки, а не двойные.

Это:

a.Bus_Area_ID = b.Bus_Area_ID and b."GBU External Segment Description"= "Printing"

Должно быть так:

a.Bus_Area_ID = b.Bus_Area_ID and b.[GBU External Segment Description] = 'Printing'

Как правило, строковые значения в SQL заключаются не в двойные кавычки, а в одинарные кавычки.

Также в первой строке:

p5 <-sqlQuery(con,'SELECT a.region,a.Country,a.Qtr_ID,Net_VAT as Variable_Type,"Printing" as [External_Segment]

Вы пытаетесь вывести Printing как постоянный результат этого запроса? Если это так, и это не имя поля, то вам также следует заключить это в ' одинарные кавычки, а не двойные. Это, вероятно, то, что предупреждает первую ошибку, которую вы видите.

Так что это становится:

p5 <-sqlQuery(con,'SELECT a.region,a.Country,a.Qtr_ID,Net_VAT as Variable_Type,'Printing' as [External_Segment]

Предыдущий комментарий к вашему вопросу о переносе имен полей с [] является правильным, вы должны использовать [] квадратные скобки, чтобы обернуть имена полей с пробелами в них.

Этот запрос должен работать:

p5 <-sqlQuery(con,'SELECT  a.region,a.Country,a.Qtr_ID,Net_VAT as Variable_Type,\'Printing\' as [External_Segment]
                          ,SUM(a.VR_Value) as Value
          from
          (SELECT  d.region,d.Country,dt.Qtr_ID
          ,sum([Actuals YTD]/1000000) as VR_Value
          FROM ZOOM_DATAMART.dbo.[New_BalSheet_Fact] a
          inner join [dbo].[Buss_Area_Dim_V] b
          on 
          a.Bus_Area_ID = b.Bus_Area_ID and b.[GBU External Segment Description]= \'Printing\'
          inner join [dbo].[BSR_Header_GA_Dim_V] c
          on
          a.BSR_HEADER_GA_KEY= c.BSR_HEADER_GA_KEY and c.[Group Account Identifier] IN (1291,2150,2151,2152,2153,2154)
          inner join [dbo].[Legal_Company_Dim_V] d
          on a.Legal_Cmp_Key = d.Legal_Cmp_Key
          inner  join dbo.Date_Dim dt
          on a.Date_key = dt.Date_key and dt.Max_month_Flag = 1
          group by d.region,
          dt.Qtr_ID
          ,d.Country
          ) a
          Group BY
          a.region
          ,a.Country
          ,a.Qtr_ID')

Надеюсь, это поможет.

...