ホームページ >データベース >mysql チュートリアル >テーブル変数は、宣言された変数に関する SQL Server の 'IN' 句エラーをどのように解決できますか?
SQL Server: テーブル変数を使用して、宣言された変数の "IN" 句エラーを修正する
SQL Server の IN
句は、強力なフィルタリング ツールです。 ただし、宣言された変数をその中で直接使用すると、多くの場合、「varchar 値 ',' をデータ型 int に変換するときに変換に失敗しました。」というエラーが発生します。これは、変数がコンマ区切りの文字列を保持することが多く、データ型の不一致が発生するために発生します。
問題のシナリオ:
次のコード スニペットを考えてみましょう:
<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX) SET @ExcludedList = '3,4,22' SELECT * FROM A WHERE Id NOT IN (@ExcludedList)</code>
結果のエラー:
<code>Error: Conversion failed when converting the varchar value ',' to data type int.</code>
解決策: テーブル変数
このエラーを回避するには、テーブル変数を使用して値を保存します。テーブル変数にはいくつかの利点があります:
テーブル変数の動的設定:
次のコードは、WHILE
ループを使用してテーブル変数に動的に値を設定し、@ExcludedList
のカンマ区切り値を処理します。
<code class="language-sql">DECLARE @your_list TABLE (list INT) -- Note: Changed to INT to match Id data type DECLARE @Value VARCHAR(25) DECLARE @Pos INT SET @ExcludedList = '3,4,22' -- Example list SET @Pos = CHARINDEX(',', @ExcludedList) WHILE @Pos > 0 BEGIN SET @Value = SUBSTRING(@ExcludedList, 1, @Pos - 1) INSERT INTO @your_list (list) VALUES (@Value) SET @ExcludedList = SUBSTRING(@ExcludedList, @Pos + 1, LEN(@ExcludedList)) SET @Pos = CHARINDEX(',', @ExcludedList) END IF LEN(@ExcludedList) > 0 BEGIN INSERT INTO @your_list (list) VALUES (@ExcludedList) END SELECT * FROM A WHERE Id NOT IN (SELECT list FROM @your_list)</code>
使用方法:
テーブル変数を設定した後、それを IN
句で使用します。
<code class="language-sql">SELECT * FROM A WHERE Id NOT IN (SELECT list FROM @your_list)</code>
これにより、@your_list
の内容に基づいて行が効率的にフィルタリングされます。 この方法により、データ型変換の問題が回避され、可変数のカンマ区切り値を使用した動的クエリが可能になります。 list
の @your_list
列は、テーブル Id
.A
の
以上がテーブル変数は、宣言された変数に関する SQL Server の 'IN' 句エラーをどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。