我正在尝试执行一个需要将变量传递给它的存储过程。一种是静态变量,另一种是动态变量。
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 ')
但这不起作用,又出现错误 “消息 8180,第 16 级,状态 1,第 1 行 无法准备报表。 消息 102,第 15 级,状态 1,第 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)
但我收到消息了
“消息 102,第 15 级,状态 1,第 24 行 “@sql”附近的语法不正确。”
OPENROWSET 似乎只能接受字符串。但我想传递一个动态变量。
您必须将整个语句放入一个变量中并运行它,并将@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)
您需要使整个查询动态化,不确定我是否确定了它,但类似于:
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)
执行 @sql 时出现错误 Incomplaint Syntax close 'ufeff' 。 就我而言,NVARCHAR 开头有无效字符。 这对我有帮助:
SET @sql = REPLACE(@sql, NCHAR(0xFEFF), '');