sp_executesql を使用した動的 T-SQL でのパラメーターの受け渡し
動的 T-SQL では、sp_executesql を使用して実行されるクエリにパラメーターを渡すことが困難になる場合があります。この記事では、UNIQUEIDENTIFIER パラメータを必要とする WHERE 句を含む動的 SQL を使用するときに直面する一般的な問題について説明します。
sp_executesql ステートメントに必要なパラメータ バインディングが欠落している次の例を考えてみましょう。
CREATE PROCEDURE [dbo].[sp_Test1] /* 'b0da56dc-fc73-4c0e-85f7-541e3e8f249d' */ ( @p_CreatedBy UNIQUEIDENTIFIER ) AS DECLARE @sql NVARCHAR(4000) SET @sql =' DECLARE @p_CreatedBY UNIQUEIDENTIFIER SELECT DateTime, Subject, CreatedBy FROM ( SELECT DateTime, Subject, CreatedBy, ROW_NUMBER() OVER(ORDER BY DateTime ) AS Indexing FROM ComposeMail WHERE CreatedBy = @p_CreatedBy /* <--- the problem is in this condition */ ) AS NewDataTable ' EXEC sp_executesql @sql
Whenこのプロシージャが実行されると、@p_CreatedBy パラメータが動的 SQL にバインドされていないため、WHERE 句の条件は失敗します。 query.
この問題を解決するには、パラメータを sp_executesql に明示的に渡す必要があります。 MSDN によると、正しい構文は次のとおりです。
EXECUTE sp_executesql @sql, N'@p UNIQUEIDENTIFIER', @p = @p_CreatedBY
これにより、@p_CreatedBy パラメータが動的 SQL ステートメントの @p パラメータに割り当てられ、WHERE 句で条件を正しく評価できるようになります。
以上がsp_executesql を使用して動的 T-SQL で UNIQUEIDENTIFIER パラメーターを正しく渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。