【问题标题】:Why does this SQL script work as it does?为什么这个 SQL 脚本会这样工作?
【发布时间】:2008-11-10 22:42:50
【问题描述】:

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

我正在这样做:

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

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

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

【问题讨论】:

  • 我不知道,但这是一个很好的问题。我迫不及待地想看到答案。
  • 今天使用它来为数据透视命令创建一串字段。惊人的。很高兴我把它加了书签。

标签: sql sql-server tsql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    假设您有 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"

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 你的回答很简洁,在我看来,最简洁地回答了这个问题。
      【解决方案4】:

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

      大概您会在批处理文件中的另一行中找到它,例如“选择@电子邮件”

      想想:

      结果 = "" + name1
      结果 = 结果 + 名称2
      结果 = 结果 + 名称3
      等等。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 2016-10-04
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多