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)
(注意:没有计算列,一切正常.)
AFAIK,您无法修改存储过程中的表值参数。如果您需要执行计算并从过程中返回它,则需要传递不带空值列的表值参数,创建具有相同结构的副本以及所需的额外列,然后返回新表额外的列或您需要的任意数量的额外列。