ホームページ >データベース >mysql チュートリアル >SQL Server の IN 句で VARCHAR 変数を使用すると変換エラーが発生するのはなぜですか?
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
.
このアプローチは、SUBSTRING
と PATINDEX
を使用した元のソリューションよりも効率的で読みやすいです。 SQL Server の組み込み文字列操作機能を活用して、最適なパフォーマンスを実現します。
以上がSQL Server の IN 句で VARCHAR 変数を使用すると変換エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。