SQL Server中的语法问题,使用OPENROWSET

时间:2014-07-16 20:47:21

标签: sql sql-server tsql concatenation openrowset

我正在尝试执行一个存储过程,需要将变量传递给它。一个是静态的,另一个是动态变量。

DECLARE @Filt DATETIME 
SET @Filt = (SELECT DISTINCT MAX(Date) FROM Data.db.Staging)
SELECT * INTO #tempData FROM OPENROWSET('SQLNCLI', 'Server=ISR14  \MSSQL2012;Trusted_Connection=yes;', 'EXEC GetData.db.Staging @Mode = ''Date'' @Filt ')

但是这不起作用,得到了错误 “Msg 8180,Level 16,State 1,Line 1 声明无法准备。 Msg 102,Level 15,State 1,Line 1 “@Filt”附近的语法不正确。“

我猜这是因为Filt是动态陈述。所以我尝试了这个

DECLARE @FilterData DATETIME
DECLARE @sql VARCHAR(200) 
SET @Filt = (SELECT DISTINCT MAX(AsOfDate) FROM Data.db.Staging)
SET @sql = 'EXEC GetData.db.Staging @Mode = ''Date'' @Filt =  '  + @Filt

SELECT * INTO #tempData FROM OPENROWSET('SQLNCLI', 'Server=ISR14\MSSQL2012;Trusted_Connection=yes;',
 @sql)

但我收到了回复信息

“Msg 102,Level 15,State 1,Line 24 “@sql”附近​​的语法不正确。“

似乎OPENROWSET只能接受字符串。但我想传递一个动态的变量。

2 个答案:

答案 0 :(得分:2)

您必须将整个语句放入变量并运行它,并将@FilterData转换为varchar以将其连接起来。

您不能在openquery / openrowset中使用变量。

尝试这个并检查打印输出......如果它工作正常,那么EXEC(@ sql2)

DECLARE @FilterData DATETIME
DECLARE @sql VARCHAR(200), @sql2 VARCHAR(500)
SET @FilterData = '2014-07-01'--(SELECT DISTINCT MAX(AsOfDate) FROM Data.db.Staging)
SET @sql = 'EXEC GetData.db.Staging @Mode = ''''Date'''', @Filt =  '''''  + CONVERT(VARCHAR(20),@FilterData ,120) + ''''''

SET @sql2 = 'SELECT * INTO #tempData FROM OPENROWSET(''SQLNCLI'', ''Server=ISR14\MSSQL2012;Trusted_Connection=yes;'',
 '''+@sql+''')'

print @sql2
--exec(@sql2)

答案 1 :(得分:1)

你需要使整个查询动态化,不确定我是否已将其固定,但是类似于:

DECLARE @Filt DATETIME 
       ,@sql VARCHAR(MAX)
SET @Filt = (SELECT MAX(Date) FROM Data.db.Staging)
SET @sql = 'SELECT * INTO #tempData FROM OPENROWSET(''SQLNCLI'', ''Server=ISR14  \MSSQL2012;Trusted_Connection=yes;'', ''EXEC GetData.db.Staging @Mode = ''''Date''' +@Filt+ ')'
EXEC (@sql)