1. ホーム
  2. sql-server

[解決済み] オペランドタイプの衝突

2022-02-19 10:19:06

質問

長いストアドプロシージャがあるのですが、プロシージャを実行すると以下のエラーが発生します。

Msg 206, Level 16, State 2, Line 1
Operand type clash: varchar(max) is incompatible with sql_variant

そこで、トラブルシューティングのために、問題のある箇所とコードを印刷しました。

SELECT  'Name' ,
                7 ,
                CASE WHEN 'varchar' = 'varbinary'
                     THEN REPLACE(UPPER(sys.fn_sqlvarbasetostr([Name])), 'X', 'x')
                     ELSE CONVERT(VARCHAR(4000), [Name])
                END , 'varchar'
        FROM    ref.dbo.datatables
        WHERE   id = 12
        ORDER BY [ID]

そのため、上記のステートメントを実行すると、次のようなエラーが発生します。

Msg 206, Level 16, State 2, Line 1
Operand type clash: varchar(max) is incompatible with sql_variant

ref.dbo.datatables テーブルの Name のデータ型は Varchar(MAX) です。

この問題を解決するにはどうしたらよいでしょうか。

お答えください。

これが、私がやった仕事です。

SELECT 'Name',
        7,
        CASE WHEN 'varchar' = 'varbinary'
        THEN REPLACE(UPPER(sys.fn_sqlvarbasetostr(CONVERT(VARBINARY,[Name]))),'X','x')
        ELSE CONVERT(VARCHAR(4000),[Name])
        END,
        'varchar'
FROM ref.dbo.datatables
WHERE id = 12
ORDER BY [ID]

解決方法は?

このエラーは正しいです。 VARCHAR(MAX)sql_variant . もし NameVARCHAR(MAX) のような)互換性のある型に変換する必要があります。 VARCHAR(8000) のパラメータとして渡すためです。 sys.fn_sqlvarbasetostr()

msdnを参照してください。

sql_variant オブジェクトは、text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、timestamp、および Microsoft .NET Framework 共通言語ランタイム(CLR)ユーザー定義型以外のあらゆる SQL Server データ型のデータを保持することが可能です。sql_variantデータのインスタンスは、その基礎となるデータ型としてsql_variantを持つこともできません。

の機能が必要な場合 sys.fn_sqlvarbasetostr() データを失うことなくcolをダウンコンバートすることができない場合、その関数の独自のバージョンをロールバックする必要があるかもしれません。CLRは良い方法でしょう。