2016-04-25 58 views
1

我現在正在全面停電,希望有人能幫助我。在我的應用程序中,用戶可以通過單擊按鈕將數據從一個表複製到另一個表。源表中的數據將以不同方式檢索,具體取決於用戶單擊複製按鈕的頁面。根據參數複製數據

我的表

tabPlanning

+--------------+-------------+--------+--------+--------------+ 
| PlanningId | RequestId | Field1 | Field2 | Field3 | 
|--------------|-------------|--------|--------|--------------| 
| Primary key | Foreign key |  |  |    | 
+--------------+-------------+--------+--------+--------------+ 
|  INT  |  INT  | DATE | BIGINT | NVARCHAR(20) | 
+--------------+-------------+--------+--------+--------------+ 

tabPlanningCopy

+------------------+-------------+--------+--------+--------------+ 
| PlanningCopyId | RequestId | Field1 | Field2 | Field3 | 
|------------------|-------------|--------|--------|--------------| 
| Primary Key | Foreign Key |  |  |    | 
+------------------+-------------+--------+--------+--------------+ 
|  INT  |  INT  | DATE | BIGINT | NVARCHAR(20) | 
+------------------+-------------+--------+--------+--------------+ 

我的存儲過程

spCopyPlanning

spCopyPlanning拷貝數據從tabPlanningtabPlanningCopy取決於參數:

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聲明來實現,但我現在還沒有任何線索如何解決這個問題。任何人都可以帶我去解決我的冗餘代碼?

回答

1

它是多餘的,因爲除WHERE子句之外的所有東西都是相同的,除非它評估參數是否爲空。由於參數是或不是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