Sql 在OPENROWSET查询中使用变量

Sql 在OPENROWSET查询中使用变量,sql,sql-server,sql-server-2008,openrowset,Sql,Sql Server,Sql Server 2008,Openrowset,我对此查询有问题: SELECT * FROM OPENROWSET( 'SQLNCLI', 'DRIVER={SQL Server};', 'EXEC dbo.sProc1 @ID = ' + @id ) 给出一个错误: “+”附近的语法不正确 有人知道我为什么会出现此错误吗?OPENROWSET需要字符串文本,而不是表达式。它在抱怨加号,因为它只需要一个字符串文字,而后面跟着一个运算符 请参见哪些国家: “查询” 是发送给提供程序并由提供程序执行的字符串常量

我对此查询有问题:

SELECT * 
FROM OPENROWSET(
    'SQLNCLI',
    'DRIVER={SQL Server};',
    'EXEC dbo.sProc1 @ID = ' + @id 
 )
给出一个错误:

“+”附近的语法不正确


有人知道我为什么会出现此错误吗?

OPENROWSET需要字符串文本,而不是表达式。它在抱怨加号,因为它只需要一个字符串文字,而后面跟着一个运算符

请参见哪些国家:

“查询”

是发送给提供程序并由提供程序执行的字符串常量


正如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)
不管它值多少钱。。 我们使用openrowset而不是直接链接服务器查询的原因是链接服务器查询的处理发生在本地服务器上。(动作缓慢,通常会将大部分桌子放回原位)

是的,我们可以像上面那样做字符串浓缩

一个不同的选项,您可以轻松地使用语法和参数

在远程框上创建一个存储的proc,该proc具有所需的所有参数。 使用标准的链接服务器查询从调用存储的进程(性能与上述解决方案相同或更好,并且更易于编码)

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


只是一个选项……

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

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)
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
您可以使用
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 

谢谢Scott,我想我收到的错误消息给了我这个想法。嗨,欢迎来到StackOverflow。请不要只发布代码答案,而是包括一个解释。特别是对于这样的问题,问题是“为什么这不起作用?”而不是“还有什么可以起作用?”虽然我大体上同意帖子应该有一些解释,但由于这个问题在2012年12月得到了回答,所以不需要太多解释。我发现这个回答很有用,因为它显示了连接Excel文件的参数值(数据库参数)和sheet$作为SQL Server数据库和表的替代方案。如果解释一下它是如何解决问题的,这个答案可能会更好。