SQL Server中的临时表和表值参数

时间:2013-01-05 16:21:18

标签: sql-server-2008

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

  

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

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

由于

2 个答案:

答案 0 :(得分:3)

不能修改TVP的内容。如果您需要此功能,请上传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 

答案 1 :(得分:2)

  

不能修改表作为参数吗?

没有。这是对TVP的限制之一。

限制为documented

  

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

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