Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在存储过程中定义计算列_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

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

Sql 如何在存储过程中定义计算列,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我对在存储过程中使用计算列有疑问 我的表中已经有一些字段作为计算列 现在我必须创建存储过程,这个SP应该读取computed列中的值以进行一些操作 我已经用一些游标创建了我的过程,但当我试图执行它时,我与计算列的数据类型有错误关联(正如您所知,计算列没有数据类型),所以我如何处理它。计算列确实有数据类型,它只是隐式确定的(如果这是短语)从数据上看是基于。所以如果你有 ColA int ColB int 基于ColA+ColB的计算列,计算列也将是int。因此,您需要(1)计算出计算列的for

我对在存储过程中使用计算列有疑问

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

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


我已经用一些游标创建了我的过程,但当我试图执行它时,我与计算列的数据类型有错误关联(正如您所知,计算列没有数据类型),所以我如何处理它。

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

ColA int
ColB int 

基于ColA+ColB的计算列,计算列也将是int。因此,您需要(1)计算出计算列的forumla结果的数据类型,(2)修改代码以正确说明该数据类型,(3)如Mitch Wheat所说,重写它以不使用游标。

计算列确实有数据类型,它只是根据数据隐式确定(如果这是短语的话)。所以如果你有

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

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

SELECT TOP 1 SQL_VARIANT_PROPERTY(ComputedColumnName, 'BaseType') FROM TableName
或者,如果您愿意:

SELECT DISTINCT SQL_VARIANT_PROPERTY(ComputedColumnName, 'BaseType') FROM TableName
我知道这应该做一次,以便您可以指定正确的参数类型。但如果需要,也可以在脚本中使用该函数


更新

正如Martin正确指出的那样,如果表为空,上述方法将不起作用

您可以添加一些任意行并应用该方法,或者使用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')
可以使用来确定计算列的基本数据类型:

SELECT TOP 1 SQL_VARIANT_PROPERTY(ComputedColumnName, 'BaseType') FROM TableName
或者,如果您愿意:

SELECT DISTINCT SQL_VARIANT_PROPERTY(ComputedColumnName, 'BaseType') FROM TableName
我知道这应该做一次,以便您可以指定正确的参数类型。但如果需要,也可以在脚本中使用该函数


更新

正如Martin正确指出的那样,如果表为空,上述方法将不起作用

您可以添加一些任意行并应用该方法,或者使用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')

没有看到你的代码,不可能说。但我敢打赌你真的不需要使用光标没有看到你的代码,不可能说。但我敢打赌你真的不需要使用光标或者如果表还没有数据<代码>从sys.computed\u列中选择t.name、t.precision、t.scale、t.max\u length、t.is\u nullable c连接sys.types t on t.user\u type\u id=c.user\u type\u id,其中c.name='col\u name'和c.object\u id=object\u id('schema\u name.table\u name'),或者如果表还没有数据<代码>从sys.computed\u列中选择t.name、t.precision、t.scale、t.max\u length、t.is\u nullable c连接sys.types t on t.user\u type\u id=c.user\u type\u id,其中c.name='col\u name'和c.object\u id=object\u id('schema\u name.table\u name')