在OPENROWSET查询中使用变量

时间:2012-12-12 01:40:54

标签: sql sql-server sql-server-2008 openrowset

我在查询时遇到问题:

SELECT * 
FROM OPENROWSET(
    'SQLNCLI',
    'DRIVER={SQL Server};',
    'EXEC dbo.sProc1 @ID = ' + @id 
 )

给出错误:

  

'+'附近的语法不正确。

任何人都知道我为什么会收到此错误?

6 个答案:

答案 0 :(得分:43)

正如Scott所建议的那样,你不能在OPENROWSET中使用表达式。尝试创建一个动态的sql来传递参数

Declare @ID int
Declare @sql nvarchar(max)
Set @ID=1
Set @sql='SELECT * 
FROM OPENROWSET(
               ''SQLNCLI'',
               ''DRIVER={SQL Server};'',
               ''EXEC dbo.usp_SO @ID =' + convert(varchar(10),@ID) + ''')'

-- Print @sql
 Exec(@sql)

答案 1 :(得分:11)

OPENROWSET需要字符串文字,而不是表达式。它正在抱怨加号,因为它不会指望任何超过字符串文字的东西,并且您使用运算符将​​字符串文字跟随。

请参阅http://msdn.microsoft.com/en-us/library/ms190312.aspx说明:

  

'查询'

     

是否将字符串常量发送给提供程序并由其执行...

答案 2 :(得分:2)

Declare @Route VARCHAR(200)
Declare @sql nvarchar(max)
Set @Route='C:\OCRevisiones.xlsx;'
Set @sql='SELECT * INTO FFFF
FROM OPENROWSET(
               ''Microsoft.ACE.OLEDB.12.0'',
               ''Excel 12.0;HDR=YES;Database=' + @Route + ''',
               ''SELECT * FROM [Sheet1$]'')'

 Print @sql
 --Exec(@sql)

答案 3 :(得分:0)

对于它的价值...... 我们使用openrowset而不是直接链接服务器查询的原因是链接服务器查询的处理发生在本地服务器上。 (缓慢并经常带回大部分桌子)

是的,我们可以像上面那样进行字符串连接。

一种不同的选项,您可以轻松使用语法和参数功能。

在远程复选框上创建存储过程,proc具有您需要的所有参数。 使用标准链接服务器查询调用存储过程(与上述灵魂相同或更好,并且更容易编码。

e.g。 linkedservername.database.dbo.myproc 123,'abc','someparam',getdate()

只是一个选择......

答案 4 :(得分:0)

如果您需要参数,还可以使用sp_executesql

BEGIN

DECLARE
@p_path varchar(200)='D:\Sample\test.xml',  
@v_xmlfile xml,
@v_sql nvarchar(1000)

SET @v_sql=N'select @v_xmlfile= CONVERT(XML, BulkColumn) FROM 
OPENROWSET(BULK '''+@p_path+''', SINGLE_BLOB) AS x;'

EXEC sp_executesql @v_sql,N'@v_xmlfile xml output',@v_xmlfile output;

SELECT @v_xmlfile

END

答案 5 :(得分:0)

您可以使用 Char(39) 代替 '

set @lcSql= 'SELECT production_pbook_uq,variety_uq,color_uq,grade_uq,diff_qty
            FROM OPENROWSET("SQLNCLI",
            "Server=.;Trusted_Connection=yes;",
            "EXEC serversql.dbo.sp_flower_production_varieties_consolidated @lcproduction_pbook_uq='+char(39)+@lcWo_uq+char(39)+', @lcproduct_piso_uq ='+char(39)+@lcpiso_uq+char(39)+'")'
            +'where diff_qty>0'

print @lcSql