Schatak Ответов: 2

Ошибка преобразования в SQL server "типы данных nvarchar (max) и varbinary (max) несовместимы в операторе add"


Я использую преобразование типа varbinary для переменной в динамическом запросе. Я очень хорошо справляюсь с ошибками динамических запросов и знаю, что что-то не так при преобразовании nvarchar(max) и varbinary(max) в динамический запрос.
Но я не в состоянии найти его решение.
DECLARE @Oldlogo	varbinary(max)
SET @Oldlogo = 'some binary code'
declare @query nvarchar(max)
SET @query = ''
SET @query = @query + '  IF EXISTS(SELECT 1 FROM  Company WHERE CONVERT(varbinary,Company_Logo_TopLeft) = CONVERT(varbinary,''' + @Oldlogo + ''')) '
	SET @query = @query + '  BEGIN '
	SET @query = @query + ' Do someting'	
       SET @query = @query + '   END '
SET @query = @query + '   ELSE'
       SET @query = @query + '  BEGIN '
	SET @query = @query + ' Do someting else'	
	SET @query = @query + '   END '
EXEC (@query)

Сообщение об ошибке
"Типы данных nvarchar(max) и varbinary (max) несовместимы в операторе add."
Кто-нибудь поможет?
Спасибо

Что я уже пробовал:

Я попытался использовать запрос параметров и выполнить его с помощью sp_executesql, но безуспешно. используется sp_executeSQL и @params

CHill60

Как насчет ошибки перед этим: "Msg 257, Уровень 16, состояние 3, строка 2
Неявное преобразование из типа данных varchar в varbinary (max) не допускается. Используйте функцию CONVERT для выполнения этого запроса."

2 Ответов

Рейтинг:
0

OriginalGriff

Когда вы пишете это:

DECLARE @Oldlogo	varbinary(max)
... CONVERT(varbinary,Company_Logo_TopLeft) = CONVERT(varbinary,''' + @Oldlogo + ''')) '

Вы пытаетесь преобразовать значение VARBINARY (из @OldLogo) в VARCHAR (как часть вашей конкатенации строк) , а затем преобразовать его обратно в VARBINARY) с помощью функции CONVERT)

Вы не можете преобразовать VARBINARY в VARCHAR - такое тестирование действительно нужно проводить на уровне презентации, а не в SQL - и конкатенация двоичного значения в строку (даже если это сработало) является приглашением для SQL-инъекции.
Почему вы пытаетесь сделать это как динамический запрос?
Вы можете сравнить @OldLogo и Company_Logo_TopLeft с простым"=", не делая это динамичным вообще.


Schatak

Спасибо за ваш ответ.
без динамического запроса это прекрасно для меня. Никаких проблем там нет. Но с динамическим запросом это проблема
По какой-то причине я делаю динамический запрос, я постараюсь избежать этого . Давайте посмотрим

Рейтинг:
0

CHill60

Во-первых, чтобы исправить первую проблему:

Цитата:
Неявное преобразование из типа данных varchar в varbinary (max) не допускается. Используйте функцию CONVERT для выполнения этого запроса."
Я сделал это вот так:
SET @Oldlogo = convert(varbinary,'some binary code')
Проблема, которую вы цитируете в своем вопросе, вызвана :
SET @query = @query + '  IF EXISTS(SELECT 1 FROM  Company WHERE CONVERT(varbinary,Company_Logo_TopLeft) = CONVERT(varbinary,''' + @Oldlogo + ''')) '

Непонятно, почему вы пытаетесь вставить "какой-то двоичный код" и снова преобразовать его в varbinary.
Как только вы выясните, что вы на самом деле пытаетесь сделать, Замените
EXEC (@query)
с
PRINT @query
до тех пор, пока вы не будете полностью счастливы, что SQL, который вы генерируете, является правильным.

Это хорошая идея, чтобы начать с определенного набора данных и сделать необработанные SQL-операторы, чтобы вы могли понять, как построить динамический SQL - т. е.


Schatak

Спасибо, я понимаю.