Конкатенация переменных varchar (max) SQL Server 2005 - PullRequest
3 голосов
/ 27 января 2012

Просто столкнулся с большой головной болью при объединении нескольких переменных @varchar(max) для создания электронного письма на основе нескольких различных запросов.

В целях повышения эффективности я использовал несколько varchars для создания электронной почты сразу, вместо того, чтобы выполнять примерно один и тот же запрос два, три или более раз, чтобы создать его, используя только один varchar.

Это работало, вплоть до тех пор, пока мой varchars не набрал больше 8000 символов.Тогда объединение их всех в один varchar (которое я мог вставить в @body параметр msdb.dbo.sp_send_dbmail) вернуло "", и даже LEN () на самом деле не дал бы мне длину.

В любом случае, я справился с этим, выполняя примерно одни и те же запросы несколько раз и создавая письмо только с одним varchar(max).

TL; DR

Я не доволен решением.Как я мог добавить эти varchar(max) переменные друг к другу?

Ответы [ 3 ]

5 голосов
/ 27 января 2012

Одна вещь, с которой я столкнулся в прошлом, которая может или не может помочь здесь: SQL, кажется, «забывает», с каким типом данных он работает, когда вы объединяете varchar (max).Вместо того, чтобы поддерживать MAX, он переходит к обычной вариативности, что означает усечение до 8000 символов или около того.Чтобы обойти это, мы используем следующий трюк:

Начните с

SET @MyMaxVarchar = @aVarcharMaxValue + @SomeString + @SomeOtherString + @etc

и измените его следующим образом:

SET @MyMaxVarchar = cast(@aVarcharMaxValue as varchar(max)) + @SomeString + @SomeOtherString + @etc

Опять же, это может не помочь с вашимособая проблема, но ее запоминание может избавить вас от серьезных головных болей в будущем.

0 голосов
/ 28 июня 2016

Я обнаружил, что MS SQL молча ничего не делает при попытке объединить строку в значение NULL.поэтому это решение всегда работает для меня:

UPDATE myTable
   SET isNull(myCol, '') += 'my text'
 WHERE myColumnID = 9999
0 голосов
/ 26 февраля 2015

В вашем случае этого могло не произойти, но в SQL Management Studio встроена «ошибка», включающая VARCHAR(MAX): SQL Studio будет * выводить столько символов в таблице результатов. Вы можете проверить это:

SELECT @MyLongVar, LEN(@MyLongVar)

Вы можете обнаружить, что длина возвращаемых фактических данных (большинство текстовых редакторов могут предоставить вам это) меньше длины данных, хранящихся в переменной.

Исправление в Инструменты | Варианты | Результаты запроса | SQL Server | Результаты к сетке; увеличить максимальное количество символов | Не XML-данные в очень большое количество. К сожалению, максимум составляет 65 535, что может быть недостаточно.

Если ваша проблема не связана с выводом значения переменной в SQL Studio, не обращайте внимания.

...