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

lig*_*gos 6 c# ado.net sql-server-2008

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

我有一个表数据类型,我试图将其传递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])
)
Run Code Online (Sandbox Code Playgroud)

和存储过程定义:

CREATE PROCEDURE [report].[spRptBubblePlot]
    @pData [dbo].[DataPoint] READONLY, 
    ....
AS
BEGIN
    ....
END
Run Code Online (Sandbox Code Playgroud)

我的代码设置参数:

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

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

Ica*_*rus 1

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