ホームページ >データベース >mysql チュートリアル >SQL Server の IN 句で VARCHAR 変数を使用すると変換エラーが発生するのはなぜですか?

SQL Server の IN 句で VARCHAR 変数を使用すると変換エラーが発生するのはなぜですか?

DDD
DDDオリジナル
2025-01-09 20:42:46249ブラウズ

Why Does Using a VARCHAR Variable in an SQL Server IN Clause Cause a Conversion Error?

SQL Server の IN 句と VARCHAR 変数: トラブルシューティング ガイド

問題:

次の SQL Server コードは変換エラーを生成します:

<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX)
SET @ExcludedList = '3, 4, 22' -- Note: Strings are now enclosed in single quotes

SELECT * FROM A WHERE Id NOT IN (@ExcludedList)</code>

エラーの説明:

IN 句は、比較される列と同じデータ型の値のカンマ区切りのリスト (この場合は Id、おそらく整数) を期待します。 変数 @ExcludedList は、文字列を含む VARCHAR(MAX) です。 SQL Server は文字列全体を暗黙的に整数に変換しようとしますが、文字列にカンマが含まれているため失敗します。

解決策:

IN 句内で直接文字列変数を使用することは避けてください。代わりに、テーブル値アプローチを使用してください。

<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX)
SET @ExcludedList = '3, 4, 22'

DECLARE @IntExcludedList TABLE (ID INT);
INSERT INTO @IntExcludedList (ID)
SELECT value FROM STRING_SPLIT(@ExcludedList, ',');

SELECT * FROM A WHERE Id NOT IN (SELECT ID FROM @IntExcludedList);</code>

この改良されたコードは、コンマ区切りの文字列を個々の行に効率的に分割する組み込み関数である STRING_SPLIT を利用します。 次に、各行の値が整数テーブル変数 @IntExcludedList に挿入され、Id 列との正しい比較が可能になります。 この方法により、暗黙的な変換が防止され、IN 句が意図したとおりに動作することが保証されます。 @ExcludedList.

の文字列値を一重引用符で囲んでいることに注意してください。

このアプローチは、SUBSTRINGPATINDEX を使用した元のソリューションよりも効率的で読みやすいです。 SQL Server の組み込み文字列操作機能を活用して、最適なパフォーマンスを実現します。

以上がSQL Server の IN 句で VARCHAR 変数を使用すると変換エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。