8

私はこのコードを持っています:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetProfitDeals]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[GetProfitDealsVar2]
GO

IF EXISTS(SELECT 1 FROM sys.types WHERE name = 'TableOrderType' AND is_table_type = 1 AND SCHEMA_ID('dbo') = schema_id)
DROP TYPE [dbo].[TableOrderType];

CREATE TYPE TableOrderType AS TABLE(
    Order_ID int NOT NULL,
    Order_AccNumber int NOT NULL,
    Order_OpenDate datetime NULL,
    Order_CloseDate datetime NULL,
    Order_Profit float NULL
);
GO

CREATE PROCEDURE [dbo].[GetProfitDeals](@OpenDate datetime = NULL, @CloseDate datetime  = NULL, @MinProfit float = NULL, @out TableOrderType OUTPUT READONLY)
AS
    INSERT INTO @out
    SELECT * FROM [Orders]
    WHEN [Orders].[OpenDate] >= @OpenDate
GO

しかし、「構築 'READONLY' に関する構文が正しくありません」というエラーが表示されます。OUTPUTテーブルパラメータが本当に必要なので、これを修正するにはどうすればよいですか。

4

2 に答える 2

12

テーブル パラメータは読み取り専用です。それらを選択することはできません。テーブル値パラメーターを使用する:

テーブル値パラメーターは、入力 READONLY パラメーターとして Transact-SQL ルーチンに渡す必要があります。ルーチン本体のテーブル値パラメーターに対して、UPDATE、DELETE、INSERT などの DML 操作を実行することはできません。

テーブル値パラメーター:

テーブル値パラメーターでデータを返すことはできません。テーブル値パラメーターは入力専用です。OUTPUT キーワードはサポートされていません。

代替案に関する包括的な説明については、「SQL Server の配列とリスト」を参照してください。

于 2013-10-09T11:30:10.930 に答える
1

Remus が述べているように、正確にそれを行うことはできませんが、代わりにユーザー定義関数を使用して達成したいことを達成することができます: 関数またはストア プロシージャからテーブルを返す tsql

テーブルにデータを返しますが、タイプとして定義するのではなく、関数でテーブルを定義する必要があると思います

于 2013-10-09T11:40:33.283 に答える