1

In my SQL Server database table there is one variable with spaces. I am trying to write one query in the RODBC::sqlQuery function but I am not able to use this variable.

  • I tried to use single quotes but that doesn't work.
  • I tried to use paste option and create one string for query but even that also did not work.

Following is the query:

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)

The issue is happening with "GBU External Segment Description". I get following error:

chr [1:4] "42S22 207 [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Printing'." ...

Then I removed double quote from printing but still for "GBU External Segment Description" it doesn't accept and throws following error:

chr [1:3] "42000 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'GBU External Segment Description'." ...

2
  • I thought you needed to wrap field names with spaces in [] Commented Apr 30, 2018 at 12:16
  • IT worked thanks a lot Commented Apr 30, 2018 at 12:53

2 Answers 2

1

The error is not with the fieldname I believe, but with the varchar constant that you are looking for. You should be using single quotes, not double.

This:

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

Should be this:

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

Generally, String values in SQL are not wrapped in double quotes, but single quotes.

Also, in your first line:

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

Are you trying to output Printing as a constant result from this query? If so, and it is not a field name, then you should also wrap that in ' single quotes, not double. That is likely what is cauing the first error that you are seeing.

So that it becomes:

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

The previous comment on your question about wrapping fieldnames with [] is correct, you should use [] the square brackets to wrap field names with spaces in them.

This query should work:

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')

Hope this helps.

Sign up to request clarification or add additional context in comments.

7 Comments

as mentioned in the question i tried that (used single quote) it worked for all the variables other than 'GBU External Segment Description' where I got following error: chr [1:3] "42000 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'GBU External Segment Description'." ...
I am not suggestion that you wrap the field name with single quotes, but the varchar Printing so that it becomes 'Printing'. If it still does not make sense, perhaps I will edit the answer.
sorry to say but I am not able to understand it , please elaborate it a bit more. Just to update you that other suggestion in same post -- to use [ ] to wrap such variable worked
Ok, I tried giving it an edit. Let me know if the query works. A question: is "Printing" a string that you want to output, or the name of a field?
"Printing" is one string while GBU External Segment Description is a field
|
1

Overall, your main issue involves confusing and conflating identifiers and literals. As information, in ANSI-SQL (the formal, industry standard of the SQL language that most RDBMS's adhere to including SQL Server, Oracle, Postgres, etc.), single quotes and double quotes are used for different purposes.

Single quotes are used to enclose string literals within char, varchar, text data type columns such as 'Printing'. Your first error message actually points to Printing as the MSSQL engine attempted to search for a column name since you wrapped this value in double quotes.

Double quotes are used for identifiers including column names and table names such as c."Group Account Identifier". Your second error points to the use of qualifying a table alias, c, to a literal value since you wrapped this value in single quotes.

Below are few common uses of this type:

  • Double quotes explicitly impose case sensitivity. Specifically, when you wrap column names in double quotes, the same characters in camel case, lower case, and upper case render different values and an error will raise if they do not align to the actual case used in table creation (i.e., tbl."ColumnName" <> tbl."COLUMNNAME").

  • Double quotes help escape special characters (!@#$%^&*?) and spaces. Hence, you can use c."Group Account Identifier" to identify the column. However, some RDBMS's have their own escaping symbols for special characters and spaces which are not ANSI standards. For example, SQL Server can use square brackets [...]; MySQL can use backticks `...`; SQLite and MS Access can use both.

  • Double quotes help escape reserved words of the current RDBMS which for you includes SQL Server's list. However, it is advised not to use such words, special characters, accents, or spaces in column names.


With that said, like any rule there are exceptions. Both types of quotes may be used with string literals for some databases that allow non-ANSI modes. However, this is not advised to do in practice. Unlike most programming languages such as R, Python, PHP, Perl, XSLT that can swap these two types of quotes for string values, SQL at its base core is not one of them.


Therefore, use either quote type accordingly:

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

Or

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

8 Comments

when I use same query (mentioned in question) in SQL studio it works fine but throws error( which I mentioned in my question) in R Second option ( you suggested) is working fine. Thanks for your detailed answer
Curious why first option did not work. I looked at the edited history of posted question to see all versions. You used double quotes around the literal Printing which is the issue of the error. You can use double quotes around column names (i.e., identifiers) as my answer details. Please advise if first option really throws the same error as you posted above.
reason could be that in sqlQuery funtion of R we pass SQL qeurry in double quote e.g sqlQuery(<connection>,"<>"), as there is already one double quote may be other one inside it is not allowed that why even for "Printing" i had to change to 'Printing'
Once again you confuse literals with identifiers. As my answer here stresses, Printing is a string literal that should be enclosed in single quotes (never double). Also your R SQL is a single quoted string (no double quotes). And even if it is a double quoted string, you can escape embedded double quotes with backslash, \.
need to check if R-SQL works in single quote as well, I always used double quoted string. I tried with backslash that did not work, so only suggestion that worked was to enclose variables in [ Var ]
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.