2014-09-01 2 views
0

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

UDF должен быть применен/вызван во время процесса создания таблицы, вот где у меня небольшая проблема.

UDF должен был быть создан с использованием только тех случаев, когда только методы, поэтому я не могу многое изменить, но я уверен, что у меня что-то не так.

Я не уверен, что ответ уже есть или нет, но я не наткнулся на него, но так извиняюсь, если это уже ответ.

Вот UDF, который создан первый

--Create UDF 
create function [dbo].[cupidscoreUDF] 
(
    @gender char(1), 
    @name varchar(15), 
    @dob datetime, 
    @weight int, 
    @height int, 
    @smoker bit, 
    @salary int 
) 
returns int 
as 
begin 
    declare @score int 

    -- To determine age in years 
    declare @Age int 
    select @Age = DATEDIFF(YEAR, @dob, GETDATE()) 

    select 
     @score = case 
        when @Age between 20 and 30 then 5 
        when @Age between 31 and 40 then 4 
        when @Age between 41 and 50 then 3 
        when @Age > 50 then 2 
        else 0 
       end 

    -- To determine the height/weight ratio 
    declare @WeightHeight int 

    set @WeightHeight = @weight/@height 

    set 
     @score = @score + 
        case 
         when @WeightHeight between 20 and 25 then 1 
         when @WeightHeight between 25 and 30 then 3 
         when @WeightHeight between 30 and 35 then 4 
         when @WeightHeight between 35 and 40 then 2 
         else 0 
        end 

    -- If non-smoker add 2 points 
    if @smoker = 0 
     set @Score = @Score + 2 

    -- To determine score by salary 
    set 
     @score = @score + 
        case 
         when @salary < 50000 then 1 
         when @salary between 500001 and 60000 then 2 
         when @salary between 60001 and 70000 then 3 
         when @salary > 70000 then 4 
        end 

    return @score 
end 
; 

Теперь вот что у меня есть для процесса создания таблицы

-- Create Member_Profile table 
create table Member_Profile 
(
MemberID int primary key, 
Gender varchar(6), 
Name varchar(50), 
Dob datetime, 
Weight int, 
Height int, 
Smoker bit, 
Salary int, 
Cupid as dbo.cupidscoreUDF 
) 
GO 

insert into Member_Profile (Gender, Name, Dob, Weight, Height, Smoker, Salary) values ('Male','James',19931115, 75, 180, 0, 80000); 
insert into Member_Profile (Gender, Name, Dob, Weight, Height, Smoker, Salary) values ('Female','Rosie',19870912, 45, 150, 0, 100000); 
insert into Member_Profile (Gender, Name, Dob, Weight, Height, Smoker, Salary) values ('Male','Richard',19630402, 95, 168, 1, 200000); 

select * from Member_Profile 

ОДС принимает информацию об адресате, а затем вычисляет их «амур 'оценка от этого, который затем вставлен вместе со всем остальным в таблицу.

Любая помощь с использованием UDF было бы здорово

+1

Вы можете попробовать 'TRIGGER' в то время как вставка данных в таблицу ... – Jesuraja

+0

Ваш UDF ожидает 7 параметров. Мне нужно передать их – cha

ответ

1

Попробуйте использовать это для амура колонки:

Cupid as dbo.cupidscoreUDF(Gender, Name, Dob, Weight, Height, Smoker, Salary) 
1

я бы очень серьезно предлагаю двигаться призвание ОДС к вставке/обновлении вместо таблицы. Чтобы сделать это проще, вы можете сделать простую процедуру вставки/обновления, которая вызывает UDF. Таким образом, вы избегаете давать данные дважды.

вот очень общий пример: в этом примере немного странно делать все дополнительные шаги для чего-то такого простого, но это быстро меняется при применении реальных сценариев.

use demo 
go 

create table dbo.example_table (
id int identity(1,1) primary key, 
some_value_1 int, 
some_value_2 int, 
some_calculation int) 

go 

create function dbo.calculator_function (
@value1 int, 
@value2 int) 
returns int 
as 
begin 
declare @result int = (select @value1 + @value2 as result) 
return @result 
end 

go 

create procedure dbo.insert_example 
    @value1 int, 
    @value2 int 
as 
insert dbo.example_table (some_value_1,some_value_2,some_calculation) 
select @value1, @value2, dbo.calculator_function(@value1,@value2) 

go 

exec dbo.insert_example 1,2 

go 

select * from example_table 
0

Я предполагаю, что вы в VUW, и я предполагаю, что вы делаете 341, как я. использовать триггер, чтобы позвонить своему UDF -У дал вам достаточно, чтобы начать работу на нем, вам нужно будет объявить и установить любые переменные, которые считают необходимыми для его работы

CREATE TRIGGER [dbo].[CalculateCupid] 
ON [dbo].[Member_Profile] 
AFTER INSERT 
AS 
BEGIN 




UPDATE DBO.Member_Profile 
SET Cupid_Score = @Cupid_Score WHERE [email protected] 

END 
+0

. Я сделал это немного по-другому, как вы увидите выше, используя UDF в качестве столбца таблицы и вычисляя оценку одновременно с вставкой - теперь у меня это работает. – James

+0

@James: Вы имеете в виду, что вы сделали это, как в ответе сабина био? –

+0

@AndriyM Да, я сделал – James