2010-09-07 51 views
2

我对更高级的数据库功能(例如函数)相当陌生,但我很好奇你将如何在MSSQL中执行此操作(或者如果它是可能的,即使):SQL Server 2008字段功能 - 根据两个其他字段之间的关系返回'ok'或'no'

如果我有一个表,结构是这样的:

 
t_test 

USR_VALUE MULTIPLIER TOLERANCE VALUE_OK 
100   .8   85   OK   
100   .9   85   NO 

我怎么会得到VALUE_OK每一个依赖于该行被更新时自动更新USR_VALUE,MULTIPLIER和TOLERANCE(IE简单计算: (t_test.USR_VALUE * t_test.MULTIPLIER >= TOLERENCE)? "OK" : "NO"

+0

当你说“AUTOMA tic更新'你的意思是说,任何插入/更新应透明地执行此操作? – 2010-09-07 23:18:47

+0

在插入过程中或查询时。 – Brian 2010-09-07 23:52:47

回答

4

你想表达:

CASE 
    WHEN USR_VALUE * MULTIPLIER >= TOLERANCE THEN 'OK' 
    ELSE 'NO' 
END 

注意,您可以为使用计算列在表中添加这...

ALTER TABLE yourtable 
ADD VALUE_OK AS  CASE 
         WHEN USR_VALUE * MULTIPLIER >= TOLERANCE THEN 'OK' 
         ELSE 'NO' 
        END 

...但要注意不能使用这个值WHERE子句中执行计算和缺乏索引的成本可能会过高。搜索索引计算的列,如果你想把它带到下一个级别。

+0

这太神奇了!谢谢。任何可能的方式,我可以让你添加第一个条件,检查是否任何字段为NULL,然后返回(空字符串)? – Brian 2010-09-07 23:50:27

+1

当然 - 在CASE语句之后,您会添加'WHER USR_VALUE为NULL或MULTIPLIER为NULL''。 – 2010-09-07 23:57:15

+1

另一个选项可以让您将列索引为更快的查询,是一个插入/更新触发器。当值改变时,重新计算规则并坚持结果。无论你是做这个还是一个计算列,取决于你是否正在阅读或写作更多。 – KeithS 2010-09-08 00:01:42

0

其实我所用的代码并修改它了一点,所以它结束了类似于威尔的东西,但现在我可以在其他领域/表使用它(创建函数):

CREATE FUNCTION [dbo].[is_ok](@Number1 float, @Number2 float, @Tolerence float) 
RETURNS varchar(5) 
AS 
BEGIN 
    DECLARE @RETURN varchar(5), @RESULT float; 
    SET @RESULT = @Number1 * @Number2; 
    IF @Number1 is NULL OR @Number2 is NULL 
     SET @RETURN = ''; 
    ELSE IF @RESULT >= @Tolerence 
     SET @RETURN = 'OK'; 
    ELSE 
     SET @RETURN = 'NO'; 
    RETURN @RETURN; 
END; 

然后加入新列:

ALTER TABLE t_test ADD [value_ok] AS ([dbo].[is_ok]([user_value],[multiplier],[tolerance])); 

(这应该工作,但我没有从我所用的测试数据库复制和修改字段名称相匹配的问题的示例表)

相关问题