【问题标题】:How can I pass tables to stored procedures?如何将表传递给存储过程?
【发布时间】:2017-07-14 08:10:52
【问题描述】:

我有一个这样的数据表,一个过程将像这样在其中填充数据,

DECLARE @ClaimChanges TABLE (
    ChangeType                      NVARCHAR(10)
    ,contract_id                    int NOT NULL
    ,dispatch_id                    int NOT NULL
    ,dispatch_claim_id              int NOT NULL
    ,item_no                        VARCHAR(100) NULL
    ,old_units                      VARCHAR(100) NULL
);

然后我想将该数据传递给一个不同的存储过程,该过程将像这样定义,

CREATE procedure [dbo].[ct_audit_oncost](
    @table TABLE readonly,
    @OutValue nvarchar(255) = null output
)
as  
-- some stuff
go

我认为这是不可能的,因为我遇到了错误,

Incorrect syntax near the keyword 'TABLE'.

【问题讨论】:

标签: sql sql-server


【解决方案1】:

自 2008 版本起支持表值参数。
但是,你不能只传递你想要的任何表,首先你需要定义一个用户定义的表类型:

CREATE TYPE dbo.MyUDT as TABLE
(
ChangeType                      NVARCHAR(10)
,contract_id                    int NOT NULL
,dispatch_id                    int NOT NULL
,dispatch_claim_id              int NOT NULL
,item_no                        VARCHAR(100) NULL
,old_units                      VARCHAR(100) NULL
)

然后你可以在你的存储过程中使用它:

CREATE procedure [dbo].[ct_audit_oncost]
(
    @table dbo.MyUDT readonly,
    @OutValue nvarchar(255) = null output
)
as  
    -- some stuff
go

请注意,您还应该使用它来声明要发送到数据库的表:

DECLARE @Out nvarchar(255)
DECLARE @ClaimChanges as dbo.MyUdt

INSERT INTO @ClaimChanges (ColumnsList) VALUES (ValuesList)

EXEC ct_audit_oncost @ClaimChanges, @Out output

【讨论】:

  • 是的,这很好。但是我并不想仅仅为了这个目的而定义一个表类型,因为我永远不会再使用它了。我希望动态的东西是可能的。
  • 但是我可以取消透视数据,所以我有一个更通用的结构可以重用。谢谢,你让我思考。无论如何,我所问的问题不能直接完成,所以你已经回答了这个问题。
最近更新 更多