Tsql 根据参数复制数据

Tsql 根据参数复制数据,tsql,stored-procedures,sql-server-2014,Tsql,Stored Procedures,Sql Server 2014,我现在完全昏迷了,希望有人能帮我。在我的应用程序中,用户可以通过单击按钮将数据从一个表复制到另一个表。从源表中检索数据的方式不同,具体取决于用户单击“复制”按钮的页面 我的桌子 制表符规划 制表拷贝 我的存储过程 间谍策划 spCopyPlanning根据参数将数据从tabPlanning复制到tabPlanningCopy: ALTER PROCEDURE dbo.spCopyPlanning @PlanningId INT = NULL @RequestId INT = NU

我现在完全昏迷了,希望有人能帮我。在我的应用程序中,用户可以通过单击按钮将数据从一个表复制到另一个表。从源表中检索数据的方式不同,具体取决于用户单击“复制”按钮的页面

我的桌子

制表符规划

制表拷贝

我的存储过程

间谍策划

spCopyPlanning
根据参数将数据从
tabPlanning
复制到
tabPlanningCopy

ALTER PROCEDURE dbo.spCopyPlanning
    @PlanningId INT = NULL
    @RequestId INT = NULL
AS
BEGIN
    IF @PlanningId IS NOT NULL
    BEGIN
        IF EXISTS (SELECT * FROM tabPlanning WHERE RequestId = @RequestId)
        BEGIN
            INSERT INTO tabPlanningCopy(RequestId, Field1, Field2, Field3)
            SELECT RequestId,
                Field1,
                Field2,
                Field3
            FROM tabPlanning
            WHERE PlanningId = @PlanningId
        END
    END
    ELSE
    BEGIN
        IF EXISTS (SELECT * FROM tabPlanning WHERE RequestId = @RequestId)
        BEGIN
            INSERT INTO tabPlanningCopy(RequestId, Field1, Field2, Field3)
            SELECT RequestId,
                Field1,
                Field2,
                Field3
            FROM tabPlanning
            WHERE RequestId = @RequestId
        END
    END
END

-- @PlanningId IS NOT NULL -> copy the row with PlanningId = @PlanningId

-- @PlanningId IS NULL -> copy the row with RequestId = @RequestId

程序正在按现在编写的方式运行。然而,我不认为这是获得我想要的东西的最好方法(我讨厌冗余!)。我很确定可以通过扩展
WHERE
语句来实现,但是我现在没有任何线索来解决这个问题。有谁能给我一个解决方案来摆脱我的冗余代码吗?

它是冗余的,因为除了WHERE子句之外,所有的东西都是相同的,除非它计算一个参数是否为null。由于参数是否为null,只需在Where中指定两对条件即可。请尝试以下操作:

ALTER PROCEDURE dbo.spCopyPlanning
    @PlanningId INT = NULL
    @RequestId INT = NULL
AS
BEGIN
    IF EXISTS (SELECT * FROM tabPlanning WHERE RequestId = @RequestId)
    BEGIN
        INSERT INTO tabPlanningCopy(RequestId, Field1, Field2, Field3)
        SELECT RequestId,
            Field1,
            Field2,
            Field3
    FROM tabPlanning
    WHERE (@PlanningId is not null
            and PlanningId = @PlanningId)
        or (@PlanningId is null
            and RequestId = @RequestId)
    END
END
ALTER PROCEDURE dbo.spCopyPlanning
    @PlanningId INT = NULL
    @RequestId INT = NULL
AS
BEGIN
    IF @PlanningId IS NOT NULL
    BEGIN
        IF EXISTS (SELECT * FROM tabPlanning WHERE RequestId = @RequestId)
        BEGIN
            INSERT INTO tabPlanningCopy(RequestId, Field1, Field2, Field3)
            SELECT RequestId,
                Field1,
                Field2,
                Field3
            FROM tabPlanning
            WHERE PlanningId = @PlanningId
        END
    END
    ELSE
    BEGIN
        IF EXISTS (SELECT * FROM tabPlanning WHERE RequestId = @RequestId)
        BEGIN
            INSERT INTO tabPlanningCopy(RequestId, Field1, Field2, Field3)
            SELECT RequestId,
                Field1,
                Field2,
                Field3
            FROM tabPlanning
            WHERE RequestId = @RequestId
        END
    END
END

-- @PlanningId IS NOT NULL -> copy the row with PlanningId = @PlanningId

-- @PlanningId IS NULL -> copy the row with RequestId = @RequestId
ALTER PROCEDURE dbo.spCopyPlanning
    @PlanningId INT = NULL
    @RequestId INT = NULL
AS
BEGIN
    IF EXISTS (SELECT * FROM tabPlanning WHERE RequestId = @RequestId)
    BEGIN
        INSERT INTO tabPlanningCopy(RequestId, Field1, Field2, Field3)
        SELECT RequestId,
            Field1,
            Field2,
            Field3
    FROM tabPlanning
    WHERE (@PlanningId is not null
            and PlanningId = @PlanningId)
        or (@PlanningId is null
            and RequestId = @RequestId)
    END
END