ХРАНЕННАЯ ПРОЦЕДУРА Расчеты и улучшения производительности - PullRequest
2 голосов
/ 26 августа 2009

У меня в настоящее время есть следующая хранимая процедура;

CREATE PROCEDURE web.insertNewCampaign
   (
   @tmp_Id BIGINT,
   @tmp_Title VARCHAR(100),
   @tmp_Content VARCHAR(8000),
   @tmp_Pledge DECIMAL(7,2),
   --@tmp_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) Как мне разделить @tmp_Pledge на @recipients, чтобы получить @allocation, например: (@ alloc = @tmp_Pledge / @recipients)

2) Можно ли объединить эти операторы в более эффективный оператор (ы), эффективно добавляя @allocation в качестве значения в столбец [campaign_RecipShare] и уменьшая потребность в этих объявленных переменных?

Большое спасибо за любую помощь, которую вы можете предложить по любому вопросу.

; -)

Ответы [ 3 ]

1 голос
/ 26 августа 2009

1) @tmp_pledge / @recepients - я предполагаю, что выделение - это числовое поле некоторой формы в TBL_CAMPAIGNS, содержащее число в varchar, не очень хорошая идея.

2) Вам просто нужно создать выборку, которая возвращает все значения из другой таблицы и параметры, соответствующие столбцам для вставки.

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 ГДЕ addMaster_UserId = @tmp_Id И addMaster_Key = @tmp_AddyBook;

SELECT @tmp_IDENTITY = SCOPE_IDENTITY () - это возвращает недавно добавленный идентификатор IDENTITY

1 голос
/ 26 августа 2009
set @allocation = @tmp_pledge / (@recepients* 1.0)

Вы хотите сделать это, потому что в противном случае вы столкнетесь с целочисленной математикой, и результат округлится до целого числа.

1 голос
/ 26 августа 2009

После первого выбора вы можете сделать это, чтобы установить @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

Это также устраняет необходимость вычисления члена @allocation вне оператора insert.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...