我在此查询的麻烦:
SELECT *
FROM OPENROWSET(
'SQLNCLI',
'DRIVER={SQL Server};',
'EXEC dbo.sProc1 @ID = ' + @id
)
给出了一个错误:
不正确的语法附近“+”。
任何人都知道为什么我收到此错误?
我在此查询的麻烦:
SELECT *
FROM OPENROWSET(
'SQLNCLI',
'DRIVER={SQL Server};',
'EXEC dbo.sProc1 @ID = ' + @id
)
给出了一个错误:
不正确的语法附近“+”。
任何人都知道为什么我收到此错误?
正如斯科特建议,你不能使用表达式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需要字符串常量,不表达。 它抱怨的加号,becaue它并不期望什么比一个字符串字面多,你follewed字符串文字与运营商。
见http://msdn.microsoft.com/en-us/library/ms190312.aspx其中规定:
“查询”
由提供者发送和执行字符串常量...
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)
对于什么是值得。我们使用OPENROWSET而不是直接链接的服务器查询的原因是,对于一个链接的服务器查询的处理发生在本地服务器上。 (慢,往往带来最表背面)
是的,我们能做到如上字符串concatination。
不同的选项,你必须易于语法和参数的权力。
创建于遥控盒一个存储过程,即PROC有你需要的所有参数。 从一个标准的链接的服务器查询(PERF相同或大于上述soultion更好显著更容易使用的代码中调用存储的过程。
例如linkedservername.database.dbo.myproc 123, 'ABC', 'someparam',GETDATE()
只是一种选择....
如果你需要的参数,你也可以使用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