【问题标题】:Calling a UDF during table creation在创建表期间调用 UDF
【发布时间】:2014-09-01 04:42:50
【问题描述】:

我有一个 UDF,它根据进入表格的一系列值计算分数。

必须在表创建过程中应用/调用 UDF,这是我遇到一些麻烦的地方。

UDF 必须仅使用 case when 方法创建,因此我无法对此进行太多更改,但我确定我只是做了一些改动。

我不确定答案是否已经存在,但我还没有偶然发现它,如果这是已经回答的问题,我们深表歉意。

这是首先创建的 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 获取成员的信息,然后从中计算他们的“丘比特”分数,然后将其与其他所有内容一起插入到表格中。

任何使用 UDF 的帮助都会很棒

【问题讨论】:

  • 你可以尝试TRIGGER同时向表中插入数据...
  • 您的 UDF 需要 7 个参数。我需要通过他们

标签: sql sql-server tsql user-defined-functions


【解决方案1】:

尝试将此用于丘比特列:

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

【讨论】:

    【解决方案2】:

    我会非常认真地建议将 UDF 的调用移至插入/更新而不是表定义。为了使这更容易,您可以创建一个简单的过程来调用 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
    

    【讨论】:

      【解决方案3】:

      我假设你在 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 MemberID=@MemberID
      
      END
      

      【讨论】:

      • 我做了一些不同的事情,正如您将在上面看到的那样,使用 UDF 作为表格列并在插入的同时计算分数 - 我现在已经开始工作了。
      • @James:你的意思是你按照 sabin bio 的回答做了吗?
      • @James:如果您当时formally accept it 可能会有意义,即使您实际上自己找到了解决方案。
      • @AndriyM 抱歉,不知道该怎么做。现在已经整理好了
      猜你喜欢
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多