2013-01-05 27 views
1

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

男子352 NIVEL 15,埃斯塔1,Procedimiento Person_InsertCloud,拉利内阿1
的表值参数 “@TableServerIds” 必须申报与READONLY选项。

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

谢谢

回答

2

一个例子无法一个表作为一个参数可以被修改?

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

的限制是documented

表值参数必须作为输入READONLY参数对Transact-SQL例程传递。您无法对例程正文中的表值参数执行DML操作,例如UPDATE,DELETE或INSERT。

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

3

否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