【问题标题】:Select results from A table & insert into another table - Stored Procedure从一个表中选择结果并插入另一个表 - 存储过程
【发布时间】:2018-08-02 02:10:56
【问题描述】:

在我的存储过程中,我有一个 select 语句,它将返回多行结果。我想将这些结果插入到另一个表中。 当我运行存储过程时,select 语句返回了两行结果,但它只将一行结果而不是两行插入到 sendemail 表中。 有人可以帮忙吗?谢谢

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE
        @newid int,
        @Name nvarchar (50),
        @Email nvarchar(50),
        @ExpiryDate varchar(50)

    SET @newid = 0

    --Get results
    SELECT @newid = b.[Id]
    , @Name = c.[Name]
    , @Email = b.[Email]
    , @ExpiryDate = a.AccountExpiryDate
    FROM Account a
    LEFT JOIN Customer b ON c.[Id] = a.[CustomerId]
    LEFT JOIN VIP c on c.[Id] = b.[VIPId]
    WHERE a.[AccountExpiryDate] Between Cast(GETDATE() AS DATE) AND CAST(DATEADD(d, 30, GETDATE()) AS DATE)

    --Insert into send email table if return results
    IF(@newid > 0)
    BEGIN
        INSERT INTO [dbo].[SendEmail]
            VALUES (
                 5
                ,'test@hotmail.com'
                ,'Test'
                ,@Email
                ,@Name
                ,NULL
                ,NULL
                ,''
                ,NULL
                ,'Test Email'
                ,'<p>
                    Hi ' + @Name + ',<br /><br />
                    Your account will be expired on ' + @ExpiryDate + '.
                </p>'
                ,NULL
                ,NULL
                ,0
                ,GETUTCDATE()
                ,NULL
                ,1
                ,NULL
                ,1)

    END
END

【问题讨论】:

  • 你只有一个插入,所以只有一行。您想查看“INSERT INTO...SELECT...”表单。这将从选择的结果中插入。 w3schools.com/sql/sql_insert_into_select.asp 尝试一下,如果需要,可以询问更具体的语法问题。
  • 好的。它现在正在工作。谢谢@asantaballa

标签: sql sql-server stored-procedures


【解决方案1】:

你应该使用insert . . . select:

INSERT INTO [dbo].[SendEmail] ( column list goes here )
    SELECT 5, 'test@hotmail.com', 'Test', c.[Email], v.[Name], '',
           'Test Email',
           '<p>
                    Hi ' + v.[Name] + ',<br /><br />
                    Your account will be expired on ' + cast(a.AccountExpiryDate as varchar(255)) + '.
                </p>',
               0, GETUTCDATE(), 1, 1)           
   FROM Account a LEFT JOIN
        Customer c
        ON c.[Id] = a.[CustomerId] LEFT JOIN
        VIP v
        ON v.[Id] = c.[VIPId]
    WHERE a.AccountExpiryDate Between Cast(GETDATE() AS DATE) AND CAST(DATEADD(day, 30, GETDATE()) AS DATE);

注意事项:

  • 始终 明确列出您要插入的列。不这样做很容易出错。
  • 只包含实际有值的列;其余的将默认为NULL(大概)。
  • 为您的表提供有意义的表别名,例如 c 代表 Customers,而不是 VIP
  • 使用DATEADD() 时,明确写出日期部分(day 而不是d)。
  • 此查询不需要变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 2012-07-10
    相关资源
    最近更新 更多