35

このクエリに問題があります:

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

エラーが発生します:

「+」付近の構文が正しくありません。

このエラーが発生する理由を知っている人はいますか?

4

6 に答える 6

53

Scott が示唆しているように、で式を使用することはできません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)
于 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 に答える
0

それだけの価値がある.. 単純なリンク サーバー クエリではなく openrowset を使用する理由は、リンク サーバー クエリの処理がローカル サーバーで行われるためです。(遅く、多くの場合、テーブルのほとんどを元に戻します)

はい、上記のように文字列連結を行うことができます。

構文が簡単でパラメーターの力がある別のオプション。

リモート ボックスにストアド プロシージャを作成します。このプロシージャには、必要なすべてのパラメータが含まれています。標準のリンク サーバー クエリを使用してストアド プロシージャを呼び出します (上記のソリューションと同じかそれ以上のパフォーマンスで、コーディングがはるかに簡単です。

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

ただのオプション....

于 2013-12-12T17:24:04.097 に答える