web-dev-qa-db-ja.com

オペランドタイプの干渉

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

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]
12
peter

エラーは正しいです。暗黙的に(または明示的に)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が良いでしょう。

12
Code Magician

OK、それで私はこの問題を抱えていましたが、コードビハインドのDataTableの文字列列の長さに制限があることに気づき、問題を解決しました。キャストや変換は役に立ちませんでした。

dt.Columns.Add("dob", typeof(string)).MaxLength = 200;

0
HomeMade