SQL Server中的存储过程,带有选择查询,如果条件成立,然后插入查询

时间:2019-06-06 09:36:48

标签: sql sql-server tsql stored-procedures

我想创建一个存储过程,在该存储过程中,首先执行select语句,然后根据所选参数(如果有效)在另一个表中插入记录,否则不执行任何操作。如何为此编写存储过程?

我尝试使用存储过程,并且执行时没有错误,但是当我尝试执行存储过程时,它不执行过程中编写的任务。

CREATE PROCEDURE sp_CreateExpiryDocumentFollowup
    (@param INT = NULL,
     @param2 INT = NULL,
     @param3 INT = 1,
     @param4 BIT = 0,
     @followupid INT = NULL)
AS 
BEGIN
    SELECT 
        @param1 = [TABLE_A].[VEHICLE_ID],
        @param2 = [TABLE_A].[VEHICLE_DOCUMENT_ID],
        @followupid = [TABLE_B].[FOLLOWUP_ID]
    FROM 
        [TABLE_A]
    LEFT JOIN 
        [TABLE_B] ON [TABLE_B].[VEHICLE_DOCUMENT_ID] != [TABLE_A].[VEHICLE_DOCUMENT_ID]
    WHERE 
        [TABLE_A].[STATUS] = 1;

    IF @followupid = NULL
    BEGIN
        INSERT INTO [TABLE_B] (VALUE_1, VALUE_2, VALUE_3, VALUE_4)
        VALUES (@param1, @param2, @param3, @param4)
    END
END
GO

如果TABLE_B,我希望记录插入@followupid is null中。 @followupid为null,因为我仅执行了select语句。但是在执行整个存储过程时,它将返回结果0行,在我的情况下应为1行。我还检查了表,未插入任何记录,但存储过程成功运行。

1 个答案:

答案 0 :(得分:4)

这是我的写法:

CREATE PROCEDURE sp_CreateExpiryDocumentFollowup
(
    --@param1 int = null -- this is no longer needed
    --@param2 int = null -- this is no longer needed
    @param3 int = 1,
    @param4 bit = 0
    --,@followupid int = null -- -- this is no longer needed
)
AS BEGIN

    INSERT INTO [TABLE_B] (VALUE_1, VALUE_2, VALUE_3, VALUE_4)
    SELECT [TABLE_A].[VEHICLE_ID], [TABLE_A].[VEHICLE_DOCUMENT_ID], @param3, @param4
    FROM [TABLE_A]
    LEFT JOIN [TABLE_B] 
        -- as stated in the comments to the questions, 
        -- Shouldn't this condition be `=` instead of `!=`?
        ON [TABLE_B].[VEHICLE_DOCUMENT_ID] != [TABLE_A].[VEHICLE_DOCUMENT_ID]
    WHERE [TABLE_A].[STATUS] = 1
    AND [TABLE_B].[FOLLOWUP_ID] IS NULL

END
GO

您可以执行insert...select操作,而不是先选择然后插入,这会使代码更短,更易读。 这样,如果select语句不返回任何行,则不会在目标表中插入任何内容。

此外,您不能在SQL中的NULL上使用相等运算符。取而代之的是,您只能使用IS NULLIS NOT NULL(如果愿意,可以使用NOT IS NULL)。

请注意,如果select语句返回多行,则所有这些都将插入到目标表中。