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

pet*_*ter 1 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
);
Run Code Online (Sandbox Code Playgroud)

然后我想将该数据传递给另一个存储过程,该存储过程将被定义为这样,

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

我收集这是不可能的,因为我收到错误,

Incorrect syntax near the keyword 'TABLE'.
Run Code Online (Sandbox Code Playgroud)

Zoh*_*led 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
)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在存储过程中使用它:

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

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

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

INSERT INTO @ClaimChanges (ColumnsList) VALUES (ValuesList)

EXEC ct_audit_oncost @ClaimChanges, @Out output
Run Code Online (Sandbox Code Playgroud)