我有一个接收表作为参数的过程。我需要填写它,然后将其返回到执行第一个程序的另一个程序。但是,问题是,当y编译我收到此错误信息:SQL Server中的临时表和值表参数
男子352 NIVEL 15,埃斯塔1,Procedimiento Person_InsertCloud,拉利内阿1
的表值参数 “@TableServerIds” 必须申报与READONLY选项。
无法修改表格作为参数吗?我还有什么其他选择?
谢谢
我有一个接收表作为参数的过程。我需要填写它,然后将其返回到执行第一个程序的另一个程序。但是,问题是,当y编译我收到此错误信息:SQL Server中的临时表和值表参数
男子352 NIVEL 15,埃斯塔1,Procedimiento Person_InsertCloud,拉利内阿1
的表值参数 “@TableServerIds” 必须申报与READONLY选项。
无法修改表格作为参数吗?我还有什么其他选择?
谢谢
一个例子无法一个表作为一个参数可以被修改?
不是。这是对TVP的限制之一。
的限制是documented:
表值参数必须作为输入READONLY参数对Transact-SQL例程传递。您无法对例程正文中的表值参数执行DML操作,例如UPDATE,DELETE或INSERT。
而是填充一个表,你可以从你的第二个存储过程使用SELECT
返回表。
否TVP的内容无法修改。 Upvote Relax restriction that table parameters must be readonly when SPs call each other如果你想要这个功能。
另一种选择是本地#temp
表。存储过程具有对在父范围中创建的#temp
表的读取和写入访问权限。但这确实意味着子程序的主叫方需要知道这一要求,并在呼叫之前创建预期的#temp
表。
下面
CREATE PROC P1
AS
CREATE TABLE #Foo
(
X VARCHAR(50)
);
EXEC P2;
SELECT *
FROM #Foo;
GO
CREATE PROC P2
AS
IF OBJECT_ID('tempdb..#Foo') IS NULL
BEGIN
RAISERROR ('This procedure expects table #Foo to already exist',16,1);
RETURN;
END
INSERT INTO #Foo
VALUES ('Inserted by P2')
GO
EXEC P1