長いストアドプロシージャがあり、プロシージャを実行すると、次のエラーが発生します。
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]
エラーは正しいです。暗黙的に(または明示的に)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)ユーザーを除く、あらゆるSQL Serverデータ型のデータを保持できます。定義されたタイプ。 sql_variantデータのインスタンスも、基礎となる基本データ型としてsql_variantを持つことはできません。
sys.fn_sqlvarbasetostr()
の機能が必要で、データを失うことなくcolをダウンコンバートできない場合は、その関数の独自のバージョンをロールする必要がある場合があります。 CLRが良いでしょう。
OK、それで私はこの問題を抱えていましたが、コードビハインドのDataTableの文字列列の長さに制限があることに気づき、問題を解決しました。キャストや変換は役に立ちませんでした。
dt.Columns.Add("dob", typeof(string)).MaxLength = 200;