2009-08-26 5 views
2

Ich habe derzeit die folgende gespeicherte Prozedur;GESPEICHERTE VERFAHREN Berechnungen und Leistungsverbesserungen

CREATE PROCEDURE web.insertNewCampaign 
    (
    @tmp_Id BIGINT, 
    @tmp_Title VARCHAR(100), 
    @tmp_Content VARCHAR(8000), 
    @tmp_Pledge DECIMAL(7,2), 
    [email protected]_Recipients BIGINT, 
    @tmp_Date DATETIME, 
    @tmp_Private BIT, 
    @tmp_Template BIGINT, 
    @tmp_AddyBook BIGINT 
    ) 
AS 
    declare @recipients BIGINT 
    declare @tmp_IDENTITY BIGINT 
    declare @fave BIGINT 
    declare @allocation VARCHAR(50) 

    --insert campaign data 
    BEGIN TRAN 
    SELECT @recipients = addMaster_NoRecipients FROM tbl_AddressBookMaster 
    WHERE addMaster_UserId = @tmp_Id AND addMaster_Key = @tmp_AddyBook; 
    INSERT INTO TBL_CAMPAIGNS ([campaign_MemberId], [campaign_Title], [campaign_Content], [campaign_Pledge], [campaign_Date], [campaign_Private], [campaign_Template], [campaign_AddressBook], [campaign_Recipients]) 
    VALUES (@tmp_Id, @tmp_Title, @tmp_Content, @tmp_Pledge, @tmp_Date, @tmp_Private, @tmp_Template, @tmp_AddyBook, @recipients) 
    SELECT @tmp_IDENTITY = SCOPE_IDENTITY() --this returns the newly added IDENTITY ID 
    COMMIT 
...... 

So habe ich 2 Fragen:

1) Wie ich durch @recipients teilen @tmp_Pledge Sie geben @allocation zB: (@ Zuordnung = @tmp_Pledge/@recipients)

2) Ist es möglich, diese Anweisungen in eine (n) effizientere (n) Anweisung (en) mit @allocation zusammenzufassen, die effektiv als Wert in die Spalte [campaign_RecipShare] eingefügt wird und die Notwendigkeit für diese deklarierten Variablen reduziert?

Vielen Dank für jede Hilfe, die Sie für beide Fragen anbieten können.

;-)

Antwort

1

Nach der ersten wählen, können Sie dies tun setzen @allocation:

set @allocation = @tmp_pledge/@recepients 

Was macht es effizienter, es ist schon ziemlich effizient - Sie werden nicht durch nicht weniger Schritte, aber Sie können den Code ein wenig kondensieren:

INSERT INTO TBL_CAMPAIGNS (
    [campaign_MemberId], [campaign_Title], [campaign_Content], 
    [campaign_Pledge], [campaign_Date], [campaign_Private], 
    [campaign_Template], [campaign_AddressBook], [campaign_Recipients], 
    [capmain_RecipShare]) 
SELECT 
    @tmp_Id, @tmp_Title, @tmp_Content, 
    @tmp_Pledge, @tmp_Date, @tmp_Private, 
    @tmp_Template, @tmp_AddyBook, addMaster_NoRecipients, 
    @tmp_Pledge/addMaster_NoReceipients as Allocation 
FROM 
    tbl_AddressBookMaster 
WHERE 
    addMaster_UserId = @tmp_Id 
    AND addMaster_Key = @tmp_AddyBook 

SELECT @tmp_IDENTITY = SCOPE_IDENTITY() --this returns the newly added IDENTITY ID 

Damit entfällt auch die Notwendigkeit für Sie das @allocation Mitglied außerhalb der 012-BerechnungsAussage.

+0

Sieht gut aus, aber der SQL-Manager wird es nicht kompilieren. Die zweite Referenz von addMaster_NoRecepipients ist nicht ein gültiger Spaltenname. – Munklefish

1

1) @tmp_pledge/@recepients - Ich nehme an, Zuordnung ist ein numerisches Feld irgendeiner Form in TBL_CAMPAIGNS, die eine Zahl in Varchar hält, ist keine gute Idee.

2) Sie müssen nur eine Auswahl erstellen, die alle Werte aus der anderen Tabelle und die Parameter zurückgibt, die den einzufügenden Spalten entsprechen.

insert into TBL_CAMPAIGNS ([campaign_MemberId], [campaign_Title], [campaign_Content], [campaign_Pledge], [campaign_Date], [campaign_Private], [campaign_Template], [campaign_AddressBook], [campaign_Recipients], [campaign_allocation) 

select @tmp_Id, @tmp_Title, @tmp_Content, @tmp_Pledge, @tmp_Date, @tmp_Private, @tmp_Template, @tmp_AddyBook, addMaster_NoRecipients, @tmp_pledge/addMaster_NoRecipients 

VON VON tbl_AddressBookMaster WHERE addMaster_UserId = @tmp_Id UND addMaster_Key = @tmp_AddyBook;

SELECT @tmp_IDENTITY = SCOPE_IDENTITY() --Dieser die neu kehrt hinzugefügt IDENTITY ID

1
set @allocation = @tmp_pledge/(@recepients* 1.0) 

Sie das tun wollen, weil othewise werden Sie integer math und das Ergebnis laufen in rundet auf eine ganze Zahl.