使用OPENROWSET查询可变(Using a Variable in OPENROWSET Qu

2019-07-04 23:36发布

我在此查询的麻烦:

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

给出了一个错误:

不正确的语法附近“+”。

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

Answer 1:

正如斯科特建议,你不能使用表达式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)


Answer 2:

OPENROWSET需要字符串常量,不表达。 它抱怨的加号,becaue它并不期望什么比一个字符串字面多,你follewed字符串文字与运营商。

见http://msdn.microsoft.com/en-us/library/ms190312.aspx其中规定:

“查询”

由提供者发送和执行字符串常量...



Answer 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)


Answer 4:

对于什么是值得。我们使用OPENROWSET而不是直接链接的服务器查询的原因是,对于一个链接的服务器查询的处理发生在本地服务器上。 (慢,往往带来最表背面)

是的,我们能做到如上字符串concatination。

不同的选项,你必须易于语法和参数的权力。

创建于遥控盒一个存储过程,即PROC有你需要的所有参数。 从一个标准的链接的服务器查询(PERF相同或大于上述soultion更好显著更容易使用的代码中调用存储的过程。

例如linkedservername.database.dbo.myproc 123, 'ABC', 'someparam',GETDATE()

只是一种选择....



Answer 5:

如果你需要的参数,你也可以使用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


文章来源: Using a Variable in OPENROWSET Query