Хранимая процедура в SQL Server с запросом select, затем условие if и затем вставка запроса - PullRequest
0 голосов
/ 06 июня 2019

Я хочу создать хранимую процедуру, в которой первый оператор выбора и, в зависимости от выбранного параметра, если он допустим, вставляют запись в другую таблицу, иначе ничего не делают.Как написать хранимую процедуру для этого?

Я пробовал с хранимой процедурой, и она выполняется без ошибок, но когда я пытался выполнить хранимую процедуру EXEC, она не выполняет задачу, как написано в процедуре.

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 является нулевым, поскольку я выполнил только оператор выбора.Но при выполнении всей хранимой процедуры возвращается строка результата 0, которая в моем случае должна быть равна 1. И я также проверил таблицу, никакая запись не вставлена, но хранимая процедура успешно выполняется.

1 Ответ

4 голосов
/ 06 июня 2019

Вот как я бы написал:

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 не возвращает никаких строк, в целевую таблицу ничего не вставляется.

Также нельзя использовать операторы равенства для NULL в SQL.Вместо этого вы можете использовать только IS NULL или IS NOT NULL (или NOT IS NULL, если вам это нравится больше).

Обратите внимание, что если оператор выбора возвращает более одной строки, все они будут вставленыв целевой таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...