2009-08-26 81 views
2

我目前有以下存储过程;存储过程计算和性能改进

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

所以我有2个问题:

1)怎样除以@recipients @tmp_Pledge给@allocation如:(@分配= @tmp_Pledge/@recipients)

2)是否有可能通过@allocation将这些语句复合为一个更有效的语句,并将其有效地作为值插入到列[campaign_RecipShare]中,并减少对这些已声明变量的需求?

很多感谢您提供任何问题的任何帮助。

;-)

回答

1

后的第一选择,你可以做到这一点设置@allocation

set @allocation = @tmp_pledge/@recepients 

至于使其更有效率,它已经相当有效的 - 你不会经历任何步骤少,但你可以凝聚的代码位:

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 

这也消除了需要为你计算012之外@allocation成员声明。

+0

看起来不错,但sql管理器不会编译它。它说addMaster_NoReceipients的第二个引用不是一个有效的列名。 – Munklefish 2009-08-26 13:49:59

1

1)@tmp_pledge/@recepients - 我将假设分配是TBL_CAMPAIGNS中某个形式的数字字段,在varchar中持有一个数字不是一个好主意。

2)您只需构建一个select,它将返回来自另一个表的所有值以及与要插入的列匹配的参数。

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 

从tbl_AddressBookMaster WHERE addMaster_UserId = @tmp_Id AND addMaster_Key = @tmp_AddyBook;

SELECT @tmp_IDENTITY = SCOPE_IDENTITY() - 这将返回新添加的标识ID

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

你想这样做,因为othewise你会遇到的整数运算和结果将舍为整数。