この記事では、主に動的クエリを実行するための非動的 SQL Server の SQL ステートメントについて説明します。実際の操作では、結果セットを制限するために、ストアド プロシージャ内でカンマで区切られた一連の値を渡してみました。しかし、IN 句で variable を使用すると、必ず エラー メッセージ
が表示されます。この記事では主に、動的クエリを実行するための非動的 SQL ServerSQL ステートメントについて説明します。実際の操作では、ストアド プロシージャを使用してみました。一連のカンマ区切りの値を渡して結果セットを制限します。しかし、IN 句で変数を使用すると、必ずエラー メッセージが表示されます。
動的 SQL ステートメントを実行せずにクエリを完了する方法はありますか?
結果セットを制限するためにストアド プロシージャで一連のカンマ区切りの値を渡してみました。しかし、IN 句で変数を使用すると、必ずエラー メッセージが表示されます。動的 SQL ServerSQL ステートメントを実行せずにクエリを完了する方法はありますか?
専門家の回答:
動的 SQL ServerSQL ステートメントを実行せずにクエリを完了する方法はありますが、まずこの問題を調べてみましょう。次の例では、AdventureWorks データベースを使用します。
値が 1 つだけの場合、実行は問題ありません。
Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3' Select * from HumanResources.Employee Where ManagerID IN (@ManagerIDs)
しかし、カンマを追加すると、結果は次のようになります:
Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3,6' Select * from HumanResources.Employee Where ManagerID IN (@ManagerIDs) Msg 245, Level 16, State 1, Line 4 Conversion failed when converting the varchar value '3,6' to data type int.
これは、SQL Server が ManagerID 列が整数であると認識し、@ManagerID を自動的に変数に変換するためです。
この問題を解決するには、動的 SQL を使用してこのステートメントを実行します。こうすることで、クエリ全体を実行前に動的に構築できます。
Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3,6' Declare @SQL Varchar(1000) Set @SQL = 'Select * from HumanResources.Employee Where ManagerID IN (' + @ManagerIDs + ')' EXEC (@SQL)
これによりクエリを実行できるようになりますが、動的 SQL は危険であり、一部の特定の組織では許可されていません。
では、動的 SQL を使用せずにクエリを実行するにはどうすればよいでしょうか。これは XML を通じて実現できます。
最初のステップでは、カンマで区切られた文字列からXMLフィールドを生成する必要があります。
Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3,6' DECLARE @XmlStr XML SET @XmlStr = --Start Tag '' + --Replace all commas with an ending tag and start a new tag REPLACE( @ManagerIDs, ',', '') + --End Tag ''
次に、XML 値を選択すると、結果は次のようになります:
Select @XmlStr
XML フィールドを用意したので、クエリを実行すると、結果は行ごとに次のようになります:
SELECT x.ManagerID.value('.', 'INT') AS A FROM @XmlStr.nodes('//ManagerID') x(ManagerID)
これで、前のクエリを使用して結果を制限する:
SELECT * FROM HumanResources.Employee WHERE ManagerID IN( SELECT x.ManagerID.value('.', 'INT') AS A FROM @XmlStr.nodes('//ManagerID') x(ManagerID) )
または、内部結合を使用して結果を制限することもできます:
SELECT * FROM HumanResources.Employee AS A INNER JOIN (SELECT x.ManagerID.value('.', 'INT') AS ManagerID FROM @XmlStr.nodes('//ManagerID') x(ManagerID)) B ON A.ManagerID = B.ManagerID
上記の関連コンテンツは、動的クエリを実行するための非動的 SQL Server SQL ステートメントの説明です。この点に関して助けをもたらします。
以上が非動的 SQL Server SQL ステートメントを使用して動的クエリを実行する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。