如何从我们的数据库中声明的 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
我搜索了所有我能想到的方法,但找不到一种技术来初始化 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