如何在SQL Server中定义"复杂"的ComputedColumn?

Sla*_*uma 2 sql-server calculated-columns

SQL Server初学者问题:

我正在尝试在SQL Server(2008)中引入计算列.在SQL Server Management Studio的表设计器中,我可以这样做,但设计器只提供一个单独的编辑单元来定义此列的表达式.由于我的计算列将相当复杂(取决于几个数据库字段并具有一些区分差异),我希望有一种更舒适和可维护的方式来输入列定义(包括用于格式化的换行符等).

我已经看到有一个选项来定义SQL Server中的函数(标量值或表值函数).是否可以更好地定义这样的函数并将此函数用作列规范?什么样的功能(标量值,表值)?

举一个简化的例子:

我有两个数据库列:

DateTime1 (smalldatetime, NULL)
DateTime2 (smalldatetime, NULL)
Run Code Online (Sandbox Code Playgroud)

现在我想定义一个计算列"Status",它可以有四个可能的值.用虚拟语言:

if (DateTime1 IS NULL and DateTime2 IS NULL)
    set Status = 0
else if (DateTime1 IS NULL and DateTime2 IS NOT NULL)
    set Status = 1
else if (DateTime1 IS NOT NULL and DateTime2 IS NULL)
    set Status = 2
else
    set Status = 3
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望有一个函数GetStatus()可以访问表行的不同列值,我想为其计算"Status"的值,然后只将计算列规范定义为GetStatus()不带参数.

这有可能吗?或者使用"复杂"计算列定义的最佳方法是什么?

提前感谢您的提示!

mar*_*c_s 10

您始终可以使用用户定义的函数 - 将"复杂"代码包装到UDF中,并使用它来定义计算列:

CREATE FUNCTION dbo.GetStatus(@DateTime1 DATETIME, @DateTime2 DATETIME)
RETURNS INT
AS BEGIN
    DECLARE @Result INT

    IF (@DateTime1 IS NULL AND @DateTime2 IS NULL)
       SET @Result = 0
    ELSE IF (@DateTime1 IS NULL AND @DateTime2 IS NOT NULL)
       SET @Result = 1
    ELSE IF (@DateTime1 IS NOT NULL AND @DateTime2 IS NULL)
       SET @Result = 2
    ELSE
       SET @Result = 3

    RETURN @Result
END
Run Code Online (Sandbox Code Playgroud)

然后将计算列定义为:

ALTER TABLE dbo.YourTable
    ADD Status AS dbo.GetStatus(DateTime1, DateTime2)
Run Code Online (Sandbox Code Playgroud)


Ray*_*Ray 8

您可以在alter table语句中执行此操作:

alter table my_table_name
  add Status as 
    case 
      when (DateTime1 IS NULL and DateTime2 IS NULL) then 0
      when (DateTime1 IS NULL and DateTime2 IS NOT NULL) then 1
      when (DateTime1 IS NOT NULL and DateTime2 IS NULL) then 2
      else 3
    end
Run Code Online (Sandbox Code Playgroud)

编辑修复哑的复制和粘贴语法错误