Почему этот сценарий SQL работает именно так?

Я извлекаю записи адресов электронной почты из таблицы в SQL Server 2005 и хочу создать одну строку для использования в качестве списка @recipients с sp_send_dbmail. В таблице есть поле с именем EmailAddress, и в таблице 10 записей.

Я делаю это:

DECLARE @email VARCHAR(MAX)
SELECT
    @email = ISNULL(@email + '; ', '') + EmailAddress
FROM
    accounts

Теперь в @email есть список из 10 адресов электронной почты с разделителями из таблицы учетных записей.

Мои вопросы: почему / как это работает? Почему у @email не только последний адрес электронной почты в таблице?

Не знаю, но это очень хороший вопрос. Не могу дождаться ответов.

Kevin 11.11.2008 01:49

Используется сегодня для создания строки полей для команды поворота. Потрясающий. Рад, что это было добавлено в закладки.

BoltBait 28.05.2010 22:18
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
6
2
286
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Потому что для каждой строки вы объединяете текущее значение @email со следующим результатом в EmailAddress. Конкатенация строк аналогична вызову функции в том смысле, что она должна последовательно оценивать результат для каждой строки.

Поскольку выражение конкатенации оценивается один раз для каждой строки.

Ваш ответ лаконичен и, на мой взгляд, наиболее емко отвечает на вопрос.

jons911 11.11.2008 18:56

Допустим, у вас есть 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 не инициализируется повторно для каждой строки.

Другие вопросы по теме