SQL Server - 使用计算列传递表值参数

时间:2011-10-07 00:29:05

标签: c# sql-server-2008 ado.net

如何将表值参数传递给具有计算列的存储过程?

我有一个表数据类型,我试图将DataTable传递给存储过程。除了计算列之外,我的所有列都按顺序和数据类型匹配。

如果我将该列从我的DataTable中删除,我会收到此错误消息: System.Data.SqlClient.SqlException (0x80131904): Trying to pass a table-valued parameter with 3 column(s) where the corresponding user-defined table type requires 4 column(s).

如果我包含空值的列,我会得到:System.Data.SqlClient.SqlException (0x80131904): The column "TransformationSum" cannot be modified because it is either a computed column or is the result of a UNION operator.

尚未尝试摆弄特定DataColumn的任何属性。

表格类型定义:

CREATE TYPE [dbo].[DataPoint] AS TABLE 
(
    [Id] [int] NOT NULL,
    [RawDataPoint] [decimal](18, 9) NULL,
    [TransformedDataPoint] [decimal](18, 9)  NULL,
    [TransformationSum]  AS ([RawDataPoint]-[TransformedDataPoint]),

    PRIMARY KEY ([Id])
)

存储过程定义:

CREATE PROCEDURE [report].[spRptBubblePlot]
    @pData [dbo].[DataPoint] READONLY, 
    ....
AS
BEGIN
    ....
END

我的代码设置参数:

    var parm = cmd.CreateParameter();
    parm.ParameterName = "@pData";
    parm.SqlDbType = SqlDbType.Structured;
    parm.TypeName = "[dbo].[DataPoint]";
    parm.Value = myDataTable;
    cmd.Parameters.Add(parm);

(注意:没有计算列,一切正常。)

1 个答案:

答案 0 :(得分:1)

AFAIK,您无法修改存储过程中的表值参数。如果您需要执行计算并从proc中返回它,则需要传递表值参数而不使用具有空值的列,创建具有相同结构的副本以及您需要的额外列并返回新表额外的列或您需要的额外列。