Операнд Тип Clash

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

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

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

см. msdn:

Объекты

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

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

Ответ 2

Итак, у меня была эта проблема, и ничто не решило ее, пока я не понял, что строковый столбец в DataTable в Code позади должен быть ограничен по длине, и это решило проблему. Не помогло ни приведение, ни преобразование.

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