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)
您可以在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)
编辑修复哑的复制和粘贴语法错误