我正在尝试执行一个存储过程,需要将变量传递给它。一个是静态的,另一个是动态变量。
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只能接受字符串。但我想传递一个动态的变量。
答案 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)