我正在从SQL Server 2005中的表中提取电子邮件地址记录,并希望构建一个字符串以用作@recipients
列表sp_send_dbmail
。该表有一个名为EmailAddress的字段,表中有10条记录。
我这样做:
DECLARE @email VARCHAR(MAX)
SELECT
@email = ISNULL(@email + '; ', '') + EmailAddress
FROM
accounts
现在,@ email有一个半分隔的10个电子邮件地址列表,来自帐户表。
我的问题是为什么/如何运作?为什么@email只有表中的最后一个电子邮件地址?
答案 0 :(得分:5)
因为对于每一行,您将@email
的当前值与EmailAddress
中的下一个结果相连。字符串连接就像调用函数一样,因为它必须按顺序计算每一行的结果。
答案 1 :(得分:4)
假设您有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 :(得分:2)
因为连接表达式每行计算一次。
答案 3 :(得分:1)
您的SELECT不选择行 - 用于显示 - 它重复地将表达式连接到同一个变量。所以最后,你要留下的只是变量。
据推测,您可以在批处理文件中找到另一行,例如: “SELECT @email”
想想:
result =“”+ name1
结果=结果+名称2
结果=结果+名称3
等。
可能你认为SELECT variable = expression是一个组合赋值和SELECT;但它实际上只是一项任务。在任何情况下,@ email都不会为每一行重新初始化。