如何从我们的数据库中声明的 UDT Table 加载 .Net DataTAble 模式?

How can I load a .Net DataTAble schema from a UDT Table declared in our DB?

我搜索了所有我能想到的方法,但找不到一种技术来初始化 DataTable 以匹配我们数据库中声明的 UDT Table。我可以手动浏览并添加列,但我不想在这两个地方重复结构。对于正常的 table,一种选择是简单地发出 "select * where ..." 而 returns 没有结果。但是可以为 UDT Table 做这样的事情吗?

这里是背景问题。

此数据库有一个存储过程,它接受一个 Table 值参数,该参数是在同一数据库中声明的指定 UDT Table 的一个实例。大多数 UD 字段都可以为 null,并且加载 TVP 的逻辑非常复杂。我希望做的是初始化 DT,然后根据需要插入行并设置所需的 column/field 值,直到我准备好将结果扔给 SS 进行最终处理。

我当然可以在代码中添加十几个或更多字段,但细节仍在不断变化(并且可能会持续一段时间),这是我真的不想加载的原因之一代码中的所有列。

所以,有没有合理的解决办法,还是我找错树了?我已经花了更多的时间寻找我期望存在的解决方案,而不是写 100 次以上的列加载代码,但现在我只想知道它是否可能。

好的,我正在和一个比我 SQL 精明得多的朋友讨论(不需要太多),他建议了以下 SQL 查询:

"DECLARE @TVP as MyUDTTable; SELECT * FROM @TVP"

这似乎正是我想要的,所以如果其他可怜的 sap 将来想要类似的东西,我会在这里更新。也许其他人可能会提供不同或更好的答案。

这是我如何做到这一点的一个例子。 input/output 的这种风格是我和同事一起设计的,可以让他快速有效地使用 entity framework,并让我可以选择使用所有 sql 玩具。如果这与您的用途相同,您可能也会喜欢我在这里所做的 OUTPUT 用途。它会在任何调用 proc 的方法处立即吐出新创建的 ID,从而使程序可以直接进入下一个 activity,而无需纠缠我的数据库以获取数字。

我的Udt

CREATE TYPE [dbo].[udtOrderLineBatch] AS TABLE
(
[BrandId] [bigint] NULL,
[ProductClassId] [bigint] NULL,
[ProductStatus] [bigint] NULL,
[Quantity] [bigint] NULL
)

并以程序为输入

create procedure [ops].[uspBackOrderlineMultipleCreate]
    @parmBackOrderId int
   ,@UserGuid uniqueidentifier
   null
   ,@parmOrderLineBatch as udtOrderLineBatch readonly
as
    begin
            insert  ops.OrderLine
                    (
                     BrandId
                    ,ProductClassId
                    ,ProductStatusId
                    ,BackOrderId
                    ,OrderId
                    ,DeliveryId
                    ,CreatedDate
                    ,CreatedBy)
            output  cast(inserted.OrderLineId as bigint) OrderLineId
                    select  line.BrandId
                           ,line.ProductClassId
                           ,line.ProductStatus
                           ,@parmBackOrderId
                           ,null
                           ,null
                           ,getdate()
                           ,@UserGuid
                    from    @parmOrderLineBatch line
                            join NumberSequence seq on line.Quantity >= seq.Number
    end