我想创建一个存储过程,在该存储过程中,首先执行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行。我还检查了表,未插入任何记录,但存储过程成功运行。
答案 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 NULL
或IS NOT NULL
(如果愿意,可以使用NOT IS NULL
)。
请注意,如果select语句返回多行,则所有这些都将插入到目标表中。