Тип операнда Clash - PullRequest
       16

Тип операнда Clash

11 голосов
/ 01 ноября 2011

У меня длинная хранимая процедура, и когда я выполняю процедуру, я получаю следующую ошибку:

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, Level 16, State 2, Line 1
Operand type clash: varchar(max) is incompatible with sql_variant

Тип данных Name - Varchar (MAX) в таблице ref.dbo.datatables

Как решить эту проблему?

Ответ:

Вот что я сделал для работы:

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]

1 Ответ

12 голосов
/ 01 ноября 2011

Ошибка правильная, вы не можете неявно (или явно) привести VARCHAR(MAX) к sql_variant. Если Name является VARCHAR(MAX), вам необходимо преобразовать его в совместимый тип (например, VARCHAR(8000), чтобы передать его в качестве параметра в sys.fn_sqlvarbasetostr()

см. MSDN:

Объекты sql_variant могут содержать данные любого типа данных SQL Server, кроме текста, ntext, изображения, varchar (max), nvarchar (max), varbinary (max), xml, timestamp и общеязыковой среды выполнения Microsoft .NET Framework (CLR). ) пользовательские типы. Экземпляр данных sql_variant также не может иметь sql_variant в качестве базового базового типа данных.

Если вам нужна функциональность sys.fn_sqlvarbasetostr() и вы не можете преобразовать значение col без потери данных, вам может потребоваться развернуть собственную версию этой функции. CLR будет хорошей ставкой.

...