非動的 SQL Server SQL ステートメントを使用して動的クエリを実行する方法の詳細な説明

怪我咯
リリース: 2017-07-05 11:06:00
オリジナル
1898 人が閲覧しました

この記事では、主に動的クエリを実行するための非動的 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!