2017-10-03 20 views
2

SQL Serverでリンクサーバーで実行される動的クエリを作成したいとします。私はそれを次のようにしようとしています。上記のスクリプトでSQL Serverでリンクサーバーの動的クエリを作成する

USE [MYDB] 
GO 

DECLARE @company AS nvarchar(50); 
DECLARE @id nvarchar(MAX); 
DECLARE @query nvarchar(MAX); 

SET @company = 'mycompany.com'; 
SET @query = N'SELECT @csid = id FROM OPENQUERY(LINKSERVER12, 
    ''SELECT id from company where name = @comp'')'; 
EXECUTE sp_executesql @company_query, N'@comp nvarchar(50), @csid 
nvarchar(MAX) OUTPUT', @comp = @company,@csid = @id OUTPUT 

、私は動的に@compの値を渡したいです。そのために、sp_executesqlでSQLを実行している間に入出力変数を設定しようとしました。

私は、SQL文で次のエラー

構文エラーを取得しています。構文エラー行1トークンまたはそれ以降[10179]。

メッセージ7321、レベル16、状態2、行4
エラーがクエリを準備しながら、リンクサーバー「LINKSERVER12」のためのOLE DBプロバイダ「MSDASQL」に対する実行のための「会社名= @compからIDを選択」が発生しました。

エラーは、動的クエリ私は運と'@comp''''''@comp'''' 'でSQLクエリで@compを交換しようとした

N'SELECT @csid = id FROM OPENQUERY(LINKSERVER12, 
    ''SELECT id from company where name = @comp'')' 

で起こっています。どんな助けでも大歓迎です。

+0

"SET QUOTED_IDENTIFIER OFF"を使用すると、一重引用符ではなく二重引用符を使用して文字列クエリを区切ることができます。これはあなたの問題を解決するものではありませんが、一重引用符の1組をエスケープする必要はありません。 – DarrenMB

+0

名前 '@comp'、N '@ comp nvarchar(50)、@csid nvarchar(MAX)OUTPUT'、@comp = @という会社からの 'EXEC LINKSERVER12.master.dbo.sp_executesql N'SELECT id '会社、@ csid = @id OUTPUT '?それに似た何か。多層引用符を避けることができます。 – hastrb

答えて

0

文字列クエリwihtoutパラメータを作成するだけです。

USE [companyDB] 
GO 

DECLARE 
    @companyName AS nvarchar(50) 
    ,@id nvarchar(MAX) 
    ,@query NVARCHAR(MAX) 

SET @companyName = 'AMAZON' 

DECLARE @idTable TABLE 
(
    id INT 
) 

--Repace Server, UID and PWD 
SET @query = 
N'SELECT 
    [id] 
FROM OPENROWSET 
(
    N''SQLNCLI'' 
    ,N''Server=10.111.1.111;UID=username;PWD=password123;'' 
    ,N''SELECT [id] 
     FROM [companyDB] 
     WHERE [name] = '''''[email protected]+''''''' 
)' 

INSERT INTO @idTable 
EXECUTE (@query) 

SELECT TOP 1 
    @id = id 
FROM @idTable 
関連する問題