无法使用表输出参数创建存储过程

时间:2013-10-09 11:25:07

标签: sql sql-server sql-server-2012 sql-server-2012-express

我有这段代码:

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表参数。

2 个答案:

答案 0 :(得分:12)

表参数是只读的。你无法选择它们。 Use Table-Valued Parameters

  

表值参数必须作为输入READONLY参数传递给Transact-SQL例程。您不能对例程主体中的表值参数执行DML操作,如UPDATE,DELETE或INSERT。

Table-Valued Parameters

  

您无法在表值参数中返回数据。表值参数仅为输入;

。不支持OUTPUT关键字。

阅读Arrays and Lists in SQL Server,了解有关替代方案的全面讨论。

答案 1 :(得分:1)

正如Remus所说,你无法做到这一点,但你可以通过使用用户定义函数来完成你想要实现的目标: tsql returning a table from a function or store procedure

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