1. ホーム
  2. sql

[解決済み] OPENQUERYにパラメータを含む

2022-02-15 08:31:05

質問

sql openqueryの中で、次のようなパラメータを使用するにはどうすればよいですか。

SELECT * FROM OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME
where field1=@someParameter') T1 INNER JOIN MYSQLSERVER.DATABASE.DBO.TABLENAME
T2 ON T1.PK = T2.PK

解決方法は?

からの OPENQUERY のドキュメントには、次のように書かれています。

OPENQUERY は変数を受け付けません。 を引数にとります。

こちらをご覧ください 記事 を使用することで、回避することができます。

UPDATEしてください。

提案されたように、以下に記事からの推奨事項を記載します。

基本的な値を渡す

基本的なTransact-SQL文はわかっているが、1つ以上の特定の値を渡す必要がある場合、次のサンプルのようなコードを使用します。

DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT  @VAR = 'CA'
SELECT  @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'
EXEC (@TSQL)

クエリ全体を渡す

Transact-SQLクエリ全体またはリンク先サーバー名(あるいはその両方)を渡す必要がある場合は、次のサンプルのようなコードを使用します。

DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = 'MyLinkedServer'
SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ','''
SET @TSQL = 'SELECT au_lname, au_id FROM pubs..authors'')' 
EXEC (@OPENQUERY+@TSQL) 

Sp_executesql ストアドプロシージャを使用する

多層引用符を避けるには、次のサンプルのようなコードを使用してください。

DECLARE @VAR char(2)
SELECT  @VAR = 'CA'
EXEC MyLinkedServer.master.dbo.sp_executesql
N'SELECT * FROM pubs.dbo.authors WHERE state = @state',
N'@state char(2)',
@VAR