我有一个接收表格作为参数的过程。我需要填写它,然后将其返回到另一个执行第一个过程的过程。但是,问题是当 y 编译时我收到此错误消息:
Mens 352,Nivel 15,Estado 1,Procedimiento Person_InsertCloud,Línea 1
必须使用 READONLY 选项声明表值参数“@TableServerIds”。
不能修改表格作为参数吗?我还有什么其他选择?
谢谢
我有一个接收表格作为参数的过程。我需要填写它,然后将其返回到另一个执行第一个过程的过程。但是,问题是当 y 编译时我收到此错误消息:
Mens 352,Nivel 15,Estado 1,Procedimiento Person_InsertCloud,Línea 1
必须使用 READONLY 选项声明表值参数“@TableServerIds”。
不能修改表格作为参数吗?我还有什么其他选择?
谢谢
不,TVP 的内容不能修改。如果您想要此功能,请放宽限制,即当 SP 相互调用时,表参数必须是只读的。
另一个选项是本地#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
不能修改作为参数的表吗?
不,这是对 TVP 的限制之一。
该限制已记录在案:
表值参数必须作为输入 READONLY 参数传递给 Transact-SQL 例程。您不能对例程主体中的表值参数执行 DML 操作,例如 UPDATE、DELETE 或 INSERT。
您可以使用从第二个存储过程返回一个表,而不是填充一个表SELECT
。