如何将表传递给存储过程?

时间:2017-07-12 21:21:24

标签: sql sql-server

我有一个这样的数据表,一个程序就像这样填充数据,

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'.

1 个答案:

答案 0 :(得分:6)

自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