2008-11-10 33 views
6

我從SQL Server 2005中的表中拉取電子郵件地址記錄,並且想要構建一個字符串作爲與sp_send_dbmail一起使用的@recipients列表。該表有一個名爲EmailAddress的字段,表中有10條記錄。這個SQL腳本爲什麼像它一樣工作?

我這樣做:

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

現在@email已經從賬表10個的電子郵件地址的半分隔的列表。

我的問題是爲什麼/這是如何工作的?爲什麼@email只有表格中的最後一個電子郵件地址?

+0

我不知道,但這是一個很好的問題。我迫不及待地想看到答案。 – Kevin 2008-11-10 22:49:00

+0

今天用於創建樞軸命令的字段字符串。真棒。很高興我收到了書籤。 – BoltBait 2010-05-28 18:18:11

回答

5

因爲對於每一行,您將@email的當前值與EmailAddress中的下一個結果聯用。字符串連接就像調用函數一樣,它必須按順序評估每一行的結果。

2

因爲連接表達式每行計算一次。

4

假設你有3個地址:

[email protected] 
[email protected] 
[email protected] 

第一行,@emailNULL,因此它成爲"" + "[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]"

1

您的SELECT未選擇行 - 用於顯示 - 它將表達式重複連接到相同的變量。所以最後,你只剩下要顯示的就是變量。

可能你發現在批處理文件中有另一行,例如「選擇@email」

想:

結果= 「」 +名1
結果=結果+名2
結果=結果+ NAME3

也許你認爲SELECT variable = expression是一個組合賦值和SELECT;但這只是一項任務。無論如何,@email不會爲每一行重新初始化。

相關問題