Wei*_*Guo 5 sql-server linked-server dynamic-sql openquery
我需要使用参数@PickedDate从链接服务器检索数据.如果我跳过@A和@B,查询工作正常,但由于缺少单引号,它总是返回错误.请指教,谢谢.
查询:
Declare @OPENQUERY nvarchar(500), @TSQL nvarchar(max), @LinkedServer nvarchar(20), @A varchar(5), @B varchar(5), @PickedDate varchar(8)
Set @PickedDate = '20150501'
Set @A = 'AAA'
Set @B = 'BBB'
Set @LinkedServer = 'LinkedServerName'
Set @OPENQUERY = 'Select * From Openquery('+ @LinkedServer + ','''
Set @TSQL = 'SELECT cases.casenum, user.username, code
From cases
Inner join user
On cases.casenum = user.user_id
Where cases.date_opened > DateAdd(day,1-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + @PickedDate + '))
And cases.date_opened <= DateAdd(day,8-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + @PickedDate + '))
And cases.code IN (' + @A +', ' + @B + ')
ORDER BY casenum'')'
Exec (@Openquery+@TSQL)
Run Code Online (Sandbox Code Playgroud)
链接服务器"LinkedServerName"的OLE DB提供程序"MSDASQL"返回消息"[Sybase] [ODBC驱动程序] [SQL Anywhere]未找到列'AAA'".消息7321,级别16,状态2,行1准备查询时出错"
SELECT cases.casenum, username, code
From cases
Inner join user
On cases.casenum = user.user_id
Where cases.date_opened >
DateAdd(day,1-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
And cases.date_opened <=
DateAdd(day,8-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
And cases.code IN (AAA, BBB)
ORDER BY casenum"
Run Code Online (Sandbox Code Playgroud)
对于链接服务器"LinkedServerName"的OLE DB提供程序"MSDASQL"执行.
您需要在变量周围使用单引号,因为您试图使它们成为字符串文字.但同样复杂的是,您尝试在包含字符串中的另一个SQL语句的字符串中创建SQL语句.所以你需要把你的行读成:
And cases.code IN (''''' + @A +''''', ''''' + @B + ''''')
Run Code Online (Sandbox Code Playgroud)
您需要两组双引号,以便正确解释字符串文字内的字符串文字.咦?对.:)
最终,您需要构建一个包含此有效SQL语法的字符串:
Select * From Openquery(LinkedServerName,'SELECT cases.casenum, user.username, code
From cases
Inner join user
On cases.casenum = user.user_id
Where cases.date_opened > DateAdd(day,1-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
And cases.date_opened <= DateAdd(day,8-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
And cases.code IN (''AAA'', ''BBB'')
ORDER BY casenum')
Run Code Online (Sandbox Code Playgroud)
在内部SQL字符串中需要围绕AAA和BBB的两个引号,因为它也是字符串中的SQL代码.所以你需要双引号才能在你正在构建的主字符串中得到双引号.
| 归档时间: |
|
| 查看次数: |
13000 次 |
| 最近记录: |