2012-12-12 75 views

回答

34

正如斯科特建議,您不能使用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) 
9

OPENROWSET需要字符串文字,而不是表達式。它抱怨加號,因爲它不會期望超過字符串字面值,而是用操作符對字符串文字進行了擴展。

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

'query'

Is a string constant sent to and executed by the provider...

+0

感謝斯科特,我認爲錯誤味精我正在給我的想法。 –

0

對於什麼是值得的。 。 我們使用openrowset而不是直接鏈接的服務器查詢的原因是,鏈接服務器查詢的處理髮生在本地服務器上。 (緩慢並且經常帶回大部分表格)

是的,我們可以像上面那樣做字符串連接。

這是一種不同的選項,您可以輕鬆地使用語法和參數功能。

在遠程盒子上創建一個存儲過程,該過程具有所有你需要的參數。 從與標準鏈接的服務器查詢(相同PERF或大於上述soultion更好和更容易顯著調用存儲過程與進行編碼。

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

只是一種選擇....

+1

這個答案可能會更好,如果它解釋它是如何解決這個問題 – FistOfFury

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) 
+5

嗨,歡迎來到StackOverflow。請不要發佈唯一代碼的答案,但包括一個解釋。特別是對於這樣的問題,問題是「爲什麼這不起作用?」,而不是「還有什麼可行的?」 – Banana

+3

儘管我通常同意帖子應該有一些解釋,但並沒有很多解釋需要該問題已於2012年12月得到解答。 我發現此響應非常有用,因爲它顯示了連接到Excel文件(數據庫參數)的參數值以及作爲SQL Server數據庫和表的替代方式的表$。 – RyanB