我有这段代码:
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表参数。
答案 0 :(得分:12)
表参数是只读的。你无法选择它们。 Use Table-Valued Parameters:
表值参数必须作为输入READONLY参数传递给Transact-SQL例程。您不能对例程主体中的表值参数执行DML操作,如UPDATE,DELETE或INSERT。
您无法在表值参数中返回数据。表值参数仅为输入;
。不支持OUTPUT关键字。
阅读Arrays and Lists in SQL Server,了解有关替代方案的全面讨论。
答案 1 :(得分:1)
正如Remus所说,你无法做到这一点,但你可以通过使用用户定义函数来完成你想要实现的目标: tsql returning a table from a function or store procedure
哪个会在表格中返回您的数据,但我相信您需要在函数中定义表格而不是将其定义为类型