35

我在处理这个查询时遇到了问题:

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

给出一个错误:

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

有谁知道我为什么会收到这个错误?

4

6 回答 6

53

正如 Scott 所建议的,您不能在OPENROWSET.Try 中使用表达式。尝试创建动态 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)
于 2012-12-12T02:22:22.103 回答
15

OPENROWSET 需要字符串文字,而不是表达式。它抱怨加号,因为它只期望字符串文字,并且您使用运算符跟随字符串文字。

请参阅http://msdn.microsoft.com/en-us/library/ms190312.aspx其中指出:

'询问'

是一个字符串常量发送到提供者并由提供者执行...

于 2012-12-12T01:56:59.243 回答
3
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)
于 2014-08-06T20:31:21.733 回答
2

如果您需要参数,您还可以使用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
于 2018-03-16T17:41:09.783 回答
0

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

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

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

在远程盒子上创建一个存储过程,该过程具有您需要的所有参数。使用标准链接服务器查询调用存储的过程(性能相同或比上述灵魂更好,并且更容易编码。

例如linkedservername.database.dbo.myproc 123,'abc','someparam',getdate()

只是一种选择......

于 2013-12-12T17:24:04.097 回答
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 
于 2021-02-19T04:06:58.050 回答