【问题标题】:Operand Type Clash操作数类型冲突
【发布时间】:2011-11-01 16:21:30
【问题描述】:

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

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

ref.dbo.datatables表中Name的数据类型为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]

【问题讨论】:

  • CASE WHEN 'varchar' = 'varbinary' 这永远不会是真的。不确定您要使用 CASE 完成什么。 [Name] 列的数据类型是什么?
  • @JoeStefanelli 正如我所说,这是由动态 sql 组成的长存储过程的一部分,因此我打印了该语句以进行故障排除。 Varchar(Max) 是 [Name] 列的数据类型

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


【解决方案1】:

错误是正确的,您不能将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 将是一个不错的选择。

【讨论】:

    【解决方案2】:

    好的,所以我遇到了这个问题并没有解决它,直到我意识到Code behind中DataTable中的字符串列的长度应该是有限的,它解决了这个问题。没有投射或转换帮助。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2015-10-21
      • 2020-05-29
      • 1970-01-01
      相关资源
      最近更新 更多