SELECT *
FROM OPENROWSET(
'SQLNCLI',
'DRIVER={SQL Server};',
'EXEC dbo.sProc1 @ID = ' + @id
)
給出了一個錯誤:
Incorrect syntax near '+'.
任何人都知道爲什麼我收到此錯誤?
SELECT *
FROM OPENROWSET(
'SQLNCLI',
'DRIVER={SQL Server};',
'EXEC dbo.sProc1 @ID = ' + @id
)
給出了一個錯誤:
Incorrect syntax near '+'.
任何人都知道爲什麼我收到此錯誤?
正如斯科特建議,您不能使用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需要字符串文字,而不是表達式。它抱怨加號,因爲它不會期望超過字符串字面值,而是用操作符對字符串文字進行了擴展。
見http://msdn.microsoft.com/en-us/library/ms190312.aspx其中規定:
'query'
Is a string constant sent to and executed by the provider...
對於什麼是值得的。 。 我們使用openrowset而不是直接鏈接的服務器查詢的原因是,鏈接服務器查詢的處理髮生在本地服務器上。 (緩慢並且經常帶回大部分表格)
是的,我們可以像上面那樣做字符串連接。
這是一種不同的選項,您可以輕鬆地使用語法和參數功能。
在遠程盒子上創建一個存儲過程,該過程具有所有你需要的參數。 從與標準鏈接的服務器查詢(相同PERF或大於上述soultion更好和更容易顯著調用存儲過程與進行編碼。
例如linkedservername.database.dbo.myproc 123,「ABC」,「someparam」, GETDATE()
只是一種選擇....
這個答案可能會更好,如果它解釋它是如何解決這個問題 – FistOfFury
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)
感謝斯科特,我認爲錯誤味精我正在給我的想法。 –