2016-04-25 4 views
1

Ich habe gerade einen totalen Blackout und hoffe, dass mir jemand helfen könnte. In meiner Anwendung können Benutzer Daten durch Klicken auf Schaltflächen von einer Tabelle in eine andere kopieren. Die Daten aus der Quellentabelle werden abhängig von der Seite, auf der der Benutzer auf eine Kopierschaltfläche klickt, unterschiedlich abgerufen.Kopiere Daten in Abhängigkeit von Parameter

Meine Tabellen

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) | 
+------------------+-------------+--------+--------+--------------+ 

Meine gespeicherten Prozedur

spCopyPlanning

spCopyPlanning kopiert Daten tabPlanning-tabPlanningCopy in Abhängigkeit von Parametern:

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 

Das Verfahren arbeitet, wie es jetzt geschrieben wird. Ich denke jedoch nicht, dass dies der beste Ansatz ist, um zu bekommen, was ich will (ich hasse Redundanz!). Ich bin mir ziemlich sicher, dass es durch die Erweiterung der WHERE Aussage erreicht werden kann, aber ich habe jetzt keine Ahnung, wie man das löst. Könnte mich jemand zu einer Lösung führen, um meinen redundanten Code loszuwerden?

Antwort

1

Es ist überflüssig, da alles außer der WHERE-Klausel identisch ist, außer wenn ausgewertet wird, ob ein Parameter null ist oder nicht. Da Parameter Null sind oder nicht, ist es eine einfache Angelegenheit, zwei Paare von Bedingungen in dem Where anzugeben. Versuchen Sie Folgendes:

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 
Verwandte Themen