为什么这个SQL脚本可以正常工作?

时间:2008-11-10 22:42:51

标签: sql sql-server tsql

我正在从SQL Server 2005中的表中提取电子邮件地址记录,并希望构建一个字符串以用作@recipients列表sp_send_dbmail。该表有一个名为EmailAddress的字段,表中有10条记录。

我这样做:

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

现在,@ email有一个半分隔的10个电子邮件地址列表,来自帐户表。

我的问题是为什么/如何运作?为什么@email只有表中的最后一个电子邮件地址?

4 个答案:

答案 0 :(得分:5)

因为对于每一行,您将@email的当前值与EmailAddress中的下一个结果相连。字符串连接就像调用函数一样,因为它必须按顺序计算每一行的结果。

答案 1 :(得分:4)

假设您有3个地址:

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

对于第一行,@emailNULL,因此它变为"" + "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 :(得分:2)

因为连接表达式每行计算一次。

答案 3 :(得分:1)

您的SELECT不选择行 - 用于显示 - 它重复地将表达式连接到同一个变量。所以最后,你要留下的只是变量。

据推测,您可以在批处理文件中找到另一行,例如: “SELECT @email”

想想:

result =“”+ name1
结果=结果+名称2 结果=结果+名称3 等。

可能你认为SELECT variable = expression是一个组合赋值和SELECT;但它实际上只是一项任务。在任何情况下,@ email都不会为每一行重新初始化。