C# SQL Server-通过计算列传递表值参数

C# SQL Server-通过计算列传递表值参数,c#,sql-server-2008,ado.net,C#,Sql Server 2008,Ado.net,如何将表值参数传递给具有计算列的存储过程 我有一个表数据类型,我正试图将DataTable传递给存储的进程。我的所有列都按照顺序和数据类型匹配,除了一个计算列 如果我将该列保留在我的数据表中会出现以下错误: System.Data.SqlClient.SqlException(0x80131904):尝试传递具有3列的表值参数,其中相应的用户定义表类型需要4列。 如果包含具有空值的列,则会得到以下结果:System.Data.SqlClient.SqlException(0x80131904):

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

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

如果我将该列保留在我的
数据表中
会出现以下错误:
System.Data.SqlClient.SqlException(0x80131904):尝试传递具有3列的表值参数,其中相应的用户定义表类型需要4列。

如果包含具有空值的列,则会得到以下结果:
System.Data.SqlClient.SqlException(0x80131904):无法修改列“TransformationSum”,因为它是计算列或是联合运算符的结果。

尚未尝试处理特定
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
以及存储的过程定义:

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);

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

好的,您不能在存储过程中修改表值参数。如果需要执行计算并从proc中返回,则需要传递表值参数,而不传递具有空值的列,创建一个具有相同结构的副本加上所需的额外列,并返回具有额外列或所需额外列数的新表。

“这正是我所担心的。哦,好吧,至少这不是一个非常复杂的计算。