2009-08-26 10 views
2

J'ai actuellement la procédure stockée suivante;PROCÉDURE STOCKÉE Calculs et améliorations des performances

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 
...... 

J'ai donc 2 questions:

1) Comment puis-je diviser par @tmp_Pledge @recipients pour donner @allocation par exemple: (@ = allocation @tmp_Pledge/@recipients)

2) Est-il possible de combiner ces instructions en une ou plusieurs déclarations plus efficaces, @allocation étant effectivement insérée en tant que valeur dans la colonne [campaign_RecipShare], et réduisant le besoin de ces variables déclarées?

Merci beaucoup pour toute aide que vous pouvez offrir pour chaque question.

;-)

Répondre

1

Après la première sélection, vous pouvez le faire pour définir @allocation:

set @allocation = @tmp_pledge/@recepients 

Quant à la rendre plus efficace, il est déjà assez efficace - vous ne traverserez tout moins d'étapes, mais vous pouvez condenser un peu le code:

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 

Cela supprime également la nécessité de vous calculer le membre @allocation extérieur de la insert déclaration.

+0

Cela semble bon, mais le gestionnaire sql ne le compilera pas. Son dire la deuxième référence de addMaster_NoReceipients n'est pas un nom de colonne valide. – Munklefish

1

1) @tmp_pledge/@recepients - Je suppose que l'allocation est un champ numérique d'une certaine forme dans TBL_CAMPAIGNS en maintenant un nombre dans varchar n'est pas une bonne idée.

2) Vous avez juste besoin de construire un select qui retourne toutes les valeurs de l'autre table et les paramètres correspondant aux colonnes à insérer.

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 

DE DE tbl_AddressBookMaster OÙ addMaster_UserId = @tmp_Id ET addMaster_Key = @tmp_AddyBook;

SELECT @tmp_IDENTITY = SCOPE_IDENTITY() retourne la --Ce nouvellement ajouté IDENTITÉ ID

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

Vous voulez faire parce que othewise vous courrez en mathématiques entier et le résultat arrondit à un nombre entier.