Почему этот скрипт SQL работает так, как работает? - PullRequest
6 голосов
/ 11 ноября 2008

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

Я делаю это:

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

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

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

Ответы [ 4 ]

5 голосов
/ 11 ноября 2008

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

4 голосов
/ 11 ноября 2008

Скажем, у вас есть 3 адреса:

a@b.c
b@b.c
c@b.c

Для первого ряда @email равно NULL, поэтому оно становится "" + "a@b.c", поэтому "a@b.c".

Для второго ряда @email становится "a@b.c" + "; " + "b@b.c", поэтому "a@b.c; b@b.c".

В последнем ряду @email становится "a@b.c; b@b.c" + "; " + "c@b.c", поэтому "a@b.c; b@b.c; c@b.c".

2 голосов
/ 11 ноября 2008

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

1 голос
/ 11 ноября 2008

Ваш SELECT не выбирает строки - для отображения - он многократно объединяет выражение в одну и ту же переменную. Итак, в конце все, что вам осталось показать, это переменная.

Предположительно, вы обнаружите это с помощью другой строки в командном файле, например, "SELECT @email"

Подумайте:

result = "" + name1
результат = результат + имя2
результат = результат + имя3
и т. д.

Возможно, вы думаете, что переменная SELECT = выражение является комбинацией присваивания и SELECT; но это действительно просто задание. В любом случае @email не переинициализируется для каждой строки.

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