パラメータを使用した SQL Server OPENQUERY: 回避策
SQL Server の OPENQUERY
はリンク サーバー上でクエリを実行しますが、引数内で変数を直接使用することはサポートされていません。 これには、パラメータ受け渡しの回避策が必要です。
方法 1: 文字列連結を介して単純な値を渡す
特定の値が必要な単純なクエリの場合、文字列連結を使用した動的 SQL が有効なソリューションです。
<code class="language-sql">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);</code>
方法 2: クエリ全体を文字列として渡す
このアプローチにより、完全なクエリ、またはリンク サーバー名を動的に渡すことができます。
<code class="language-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);</code>
方法 3: sp_executesql を使用したよりクリーンなパラメーター処理
複雑なネストされた引用符を避けるには、sp_executesql
:
<code class="language-sql"> 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; ``` This method offers improved readability and reduces the risk of SQL injection vulnerabilities compared to string concatenation. Note that you're executing `sp_executesql` on the linked server itself. Choose the method that best suits your query complexity and preference for code clarity. Remember to prioritize security and avoid SQL injection vulnerabilities when using dynamic SQL.</code>
以上がSQL Server の OPENQUERY でパラメータを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。