1

我有一个接收表格作为参数的过程。我需要填写它,然后将其返回到另一个执行第一个过程的过程。但是,问题是当 y 编译时我收到此错误消息:

Mens 352,Nivel 15,Estado 1,Procedimiento Person_InsertCloud,Línea 1
必须使用 READONLY 选项声明表值参数“@TableServerIds”。

不能修改表格作为参数吗?我还有什么其他选择?

谢谢

4

2 回答 2

3

不,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 
于 2013-01-05T16:23:45.467 回答
2

不能修改作为参数的表吗?

不,这是对 TVP 的限制之一。

该限制已记录在案

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

您可以使用从第二个存储过程返回一个表,而不是填充一个表SELECT

于 2013-01-05T16:23:56.150 回答