2017-07-12 4 views
1

は、私はこのようなデータのテーブルを持っており、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

それは良い点です。しかし、私は特にこれを使用することはないので、この1つの目的のためだけにテーブルタイプを定義することは望ましくありません。私はダイナミックなことが可能であることを期待していました。 – peter

+0

しかし、私はデータをunpivotすることができたので、私は再利用できるより汎用的な構造を持っています。ありがとう、あなたは私を考えさせた。いずれにしても、私が求めていることは直接行うことはできないので、あなたはその質問に答えました。 – peter

関連する問題