Операнд Тип 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;