ホームページ >データベース >mysql チュートリアル >テーブル変数は、宣言された変数に関する SQL Server の 'IN' 句エラーをどのように解決できますか?

テーブル変数は、宣言された変数に関する SQL Server の 'IN' 句エラーをどのように解決できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-09 20:37:42201ブラウズ

How Can Table Variables Solve SQL Server's

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 サイトの他の関連記事を参照してください。

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