如何在存储过程中定义计算列

时间:2011-03-26 07:03:58

标签: sql sql-server sql-server-2005 tsql

我对在存储过程中使用计算列感到疑问。

我的表中已经有一些字段作为计算列。

现在我必须创建存储过程,这个SP应该读取计算列中的值来进行一些操作。

我已经使用某个游标创建了我的过程但是当我尝试执行它时,我的错误与计算列的数据类型有关(因为你知道计算列没有数据类型),所以我该如何处理这一点。

2 个答案:

答案 0 :(得分:4)

计算列确实有数据类型,它只是隐含地确定(如果这是短语)数据基于。所以,如果你有

ColA int
ColB int 

和基于ColA + ColB的计算列,计算列也将是int。因此,您需要(1)找出计算列的forumla的结果的数据类型,(2)修改您的代码以正确地说明该数据类型,并且(3)像Mitch Wheat所说的那样,将其重写为不使用光标。

答案 1 :(得分:1)

您可以使用SQL_VARIANT_PROPERTY()来确定计算列的基本数据类型:

SELECT TOP 1 SQL_VARIANT_PROPERTY(ComputedColumnName, 'BaseType') FROM TableName

或者,如果您愿意:

SELECT DISTINCT SQL_VARIANT_PROPERTY(ComputedColumnName, 'BaseType') FROM TableName

我知道应该这样做一次,这样你就可以指定正确的参数类型。但是如果需要,您也可以在脚本中使用该功能。


<强>更新

正如马丁正确指出的那样,如果表是空的,上述方法将无效。

您可以添加一些任意行并应用该方法,或使用Martin建议的替代方式,无论数据是否存在,该方法都有效:

select t.name,t.precision,t.scale,t.max_length, t.is_nullable
from sys.computed_columns c
   join sys.types t on t.user_type_id = c.user_type_id
where c.name='col_name' and c.object_id=object_id('schema_name.table_name')