2013-01-05 32 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