2

SQL Server 初学者问题:

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

我已经看到有一个选项可以在 SQL Server 中定义函数(标量值或表值函数)。定义这样一个函数并将这个函数用作列规范可能更好吗?以及什么样的函数(标量值、表值)?

做一个简化的例子:

我有两个数据库列:

DateTime1 (smalldatetime, NULL)
DateTime2 (smalldatetime, NULL)

现在我想定义一个计算列“状态”,它可以有四个可能的值。在虚拟语言中:

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

理想情况下,我希望有一个函数GetStatus()可以访问我想要计算“状态”值的表行的不同列值,然后只将计算列规范定义为GetStatus()没有参数。

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

提前感谢您的提示!

4

3 回答 3

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

然后将计算列定义为:

ALTER TABLE dbo.YourTable
    ADD Status AS dbo.GetStatus(DateTime1, DateTime2)
于 2010-04-08T07:12:53.750 回答
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

编辑以修复愚蠢的复制和粘贴语法错误

于 2010-04-07T21:38:03.860 回答
0

您可以使用触发器来确保插入或更新时的列值。

于 2010-04-07T21:28:59.533 回答