2017-07-12 96 views
1

我有這樣的數據的表,和一個程序要在它填充數據這樣的,如何將表傳遞給存儲過程?

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

這絕對有可能。你不能任意傳遞一個表。它需要被定義爲用戶定義的表類型。然後你可以通過表值參數傳遞它們。 https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine –

回答

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 
+0

是的,這是一個很好的觀點。但我並不特別想爲此目的定義表格類型,因爲我將永遠不會再使用它。我希望有動力是可能的。 – peter

+0

但是我可以將數據轉移,因此我可以使用更通用的結構。謝謝,你讓我思考。無論如何,我所要求的不能直接完成,所以你已經回答了這個問題。 – peter

相關問題