不使用存储过程的表值参数

Posted

技术标签:

【中文标题】不使用存储过程的表值参数【英文标题】:Table-Valued Parameter without using a stored procedure 【发布时间】:2018-03-19 14:52:50 【问题描述】:

我在网上能找到的似乎都是需要使用存储过程的表值参数的示例。我记得过去在没有存储过程的情况下这样做。这可能吗?

此代码不断抛出有关未指定类型的错误。

SqlCommand cmd = new SqlCommand(@"
        UPDATE t1
        SET t1.ScheduledStartUTC = t2.ScheduledStartUTC
        FROM ScheduleTickets AS t1
            INNER JOIN @SetScheduledStart AS t2 ON t1.ScheduleId = t2.ScheduleId AND t1.PatchSessionId  = t2.PatchSessionId 
    ", c);
cmd.Parameters.Add("@SetScheduledStart", SqlDbType.Structured).Value = SetScheduleTicketsDateDT;
cmd.ExecuteNonQuery();

【问题讨论】:

那是因为如果您将SqlDbType.Structured 用于TVP,您还需要设置TypeName 属性。 (如果这就是你想要的,你不能先创建这种类型。) 好的,我找到了如何指定TypeName:cmd.Parameters["@SetScheduledStart"].TypeName = "dbo.tvpUpdateScheduledStart"; 【参考方案1】:

这里你可以找到如何在没有存储过程的情况下使用它:Passing a Table-Valued Parameter to a Parameterized SQL Statement

基本上,它要求您:

    CREATE TYPE dbo.tvpUpdateScheduledStart AS TABLE (ScheduleId int, PatchSessionId int) 事先在服务器上。 在SqlParameterTypeName 属性中指定此类型。

【讨论】:

以上是关于不使用存储过程的表值参数的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要以只读方式输入 SQL Server 存储过程的表值参数?

SQL Server存储过程中使用表值作为输入参数示例

使用ado.net将多个SQL表值参数传递到单个存储过程

在使用表值参数时如何将多个参数一起传递给存储过程

如何在 Python 中使用表值参数访问 SQL Server 2008 存储过程

将表值参数传递给存储过程