我有一个很长的存储过程,当我执行该过程我得到以下错误:
Msg 206,Level 16,State 2,Line 1 Operand type clash: varchar(max) is incompatible with sql_variant
所以麻烦拍摄我已经打印了问题所在的satetement,代码是:
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,Line 1 Operand type clash: varchar(max) is incompatible with sql_variant
名称的数据类型是ref.dbo.datatables表中的Varchar(MAX)
如何解决这个问题?
回答:
这是我做的工作:
SELECT 'Name',CASE WHEN 'varchar' = 'varbinary' THEN REPLACE(UPPER(sys.fn_sqlvarbasetostr(CONVERT(VARBINARY,[Name]))),'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 objects can hold data of any sql Server data type except text,ntext,image,varchar(max),nvarchar(max),varbinary(max),xml,timestamp,and Microsoft .NET Framework common language runtime (CLR) user-defined types. An instance of sql_variant data also cannot have sql_variant as its underlying base data type.
如果您需要sys.fn_sqlvarbasetostr()的功能,并且无法在不丢失数据的情况下下转换您的col,则可能需要滚动自己的该功能版本. CLR将是一个很好的赌注.