Я извлекаю записи адресов электронной почты из таблицы в SQL Server 2005 и хочу создать одну строку для использования в качестве списка @recipients с sp_send_dbmail. В таблице есть поле с именем EmailAddress, и в таблице 10 записей.
Я делаю это:
DECLARE @email VARCHAR(MAX)
SELECT
@email = ISNULL(@email + '; ', '') + EmailAddress
FROM
accounts
Теперь в @email есть список из 10 адресов электронной почты с разделителями из таблицы учетных записей.
Мои вопросы: почему / как это работает? Почему у @email не только последний адрес электронной почты в таблице?
Используется сегодня для создания строки полей для команды поворота. Потрясающий. Рад, что это было добавлено в закладки.


Потому что для каждой строки вы объединяете текущее значение @email со следующим результатом в EmailAddress. Конкатенация строк аналогична вызову функции в том смысле, что она должна последовательно оценивать результат для каждой строки.
Поскольку выражение конкатенации оценивается один раз для каждой строки.
Ваш ответ лаконичен и, на мой взгляд, наиболее емко отвечает на вопрос.
Допустим, у вас есть 3 адреса:
[email protected]
[email protected]
[email protected]
Для первой строки @email - это NULL, поэтому он становится "" + "[email protected]", поэтому "[email protected]".
Для второй строки @email становится "[email protected]" + "; " + "[email protected]", поэтому "[email protected]; [email protected]".
В последней строке @email становится "[email protected]; [email protected]" + "; " + "[email protected]", поэтому "[email protected]; [email protected]; [email protected]".
Ваш SELECT не выбирает строки - для отображения - он многократно объединяет выражение с одной и той же переменной. Итак, в конце все, что вам осталось показать, это переменная.
Предположительно, вы обнаружите это в другой строке командного файла, например «ВЫБЕРИТЕ @email»
Считать:
результат = "" + name1
результат = результат + имя2
результат = результат + имя3
и т.п.
Возможно, вы думаете, что SELECT variable = expression - это комбинация присваивания и SELECT; но на самом деле это просто задание. В любом случае @email не инициализируется повторно для каждой строки.
Не знаю, но это очень хороший вопрос. Не могу дождаться ответов.