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 例程。您不能对例程主体中的表值参数执行 DML 操作,例如 UPDATE、DELETE 或 INSERT。

表值参数

您不能在表值参数中返回数据。表值参数仅供输入;不支持 OUTPUT 关键字。

阅读SQL Server中的数组和列表以全面讨论替代方案。

于 2013-10-09T11:30:10.930 回答
1

正如 Remus 所说,您不能完全做到这一点,但您可以通过使用用户定义函数来完成您想要实现的目标: tsql 从函数或存储过程返回表

它将在表格中返回您的数据但是我相信您需要在函数中定义表格而不是将其定义为类型

于 2013-10-09T11:40:33.283 回答