Почему этот SQL-скрипт работает так же, как и он?

Я извлекаю записи адресов электронной почты из таблицы в SQL Server 2005 и хочу создать одну строку для использования в качестве списка sp_send_dbmail с 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 не выбирает строки – для отображения – это многократное объединение выражения с той же переменной. Поэтому в конце все, что вам осталось показать, это переменная.

Предположительно, вы обнаружите, что с другой строкой в ​​пакетном файле, например, «SELECT @email»,

Думать:

result = "" + name1
result = result + name2
result = result + name3
и т.п.

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

Interesting Posts

вложенный выбор в SQL Server 2008

Подключение столбца из одной базы данных с несколькими столбцами из другой БД и возврат вывода в новый столбец

Генерирование CTE «идентификатор нескольких частей не может быть связан»

Передача значения в процедуру T-SQL и получение выходного значения из процедуры с помощью выполнения SQL-задачи SSIS

Считать предыдущие последовательные строки в SQL Server

какая строка подключения для этой базы данных

SQL: как получить все отдельные символы в столбце, по всем строкам

Undelete недавно удаленные строки sql server

Как обновить таблицу SQL, используя xp_dirtree, когда файлы добавлены в папку?

SSDT для VS2013 Не отображает SQL Server 2014 как целевую версию

все возрастающее время INSERT в таблицу

как добавить последние значения той же группы в sql-запросе

Как писать INSERT, если НЕ СУЩЕСТВУЕТ запросы в SQL Server 2005

Получать даты с номера недели в T-SQL

Удаление областей вкладок в SQL Server 2012

Давайте будем гением компьютера.