12

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

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

Name のデータ型は ref.dbo.datatables テーブルの 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]
4

2 に答える 2

12

エラーは正しいです。暗黙的に(または明示的に)にをキャストすることはできませVARCHAR(MAX)sql_variant。の場合Nameは、VARCHAR(MAX)互換性のあるタイプに変換する必要があります(VARCHAR(8000)パラメーターとしてに渡すためなど)sys.fn_sqlvarbasetostr()

msdnを参照してください:

sql_variantオブジェクトは、text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、timestamp、およびMicrosoft .NET Framework共通言語ランタイム(CLR)ユーザーを除く任意のSQLServerデータ型のデータを保持できます-定義されたタイプ。sql_variantデータのインスタンスも、基になる基本データ型としてsql_variantを持つことはできません。

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

于 2011-11-01T16:56:45.847 に答える