操作数类型冲突

时间:2011-11-01 16:21:30

标签: sql-server sql-server-2008 tsql varbinary

我有一个很长的存储过程,当我执行该过程时,我收到以下错误:

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]

2 个答案:

答案 0 :(得分:12)

错误是正确的,您无法隐式(或明确地)将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将是一个不错的选择。

答案 1 :(得分:0)

好的,所以我遇到了这个问题,什么也没解决,直到我意识到后面代码中的DataTable中的字符串列的长度应该受到限制,并且它解决了问题。没有转换或转换帮助。

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