sql-server – 操作数类型冲突

前端之家收集整理的这篇文章主要介绍了sql-server – 操作数类型冲突前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个很长的存储过程,当我执行该过程我得到以下错误
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将是一个很好的赌注.

猜你在找的MsSQL相关文章