SQL Server 中使用 OPENROWSET 的语法问题

问题描述 投票:0回答:3

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

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 似乎只能接受字符串。但我想传递一个动态变量。

sql sql-server t-sql concatenation openrowset
3个回答
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
投票

您需要使整个查询动态化,不确定我是否确定了它,但类似于:

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)

0
投票

执行 @sql 时出现错误 Incomplaint Syntax close 'ufeff' 。 就我而言,NVARCHAR 开头有无效字符。 这对我有帮助:

SET @sql = REPLACE(@sql, NCHAR(0xFEFF), '');
© www.soinside.com 2019 - 2024. All rights reserved.