2013-12-13 25 views
0

我有一個存儲過程與4個參數作爲表(前面創建爲用戶定義的表類型)和SQL管理工作室強制宣佈爲只讀,但我想通過此參數和我想做更新(我已經聲明一些字段爲空)一些行,有人可以幫助我?在SQL Server中可編輯表值

 @TEMP as TEMP READONLY 

The table-valued parameter "@TEMP" must be declared with the READONLY option. 

謝謝。

+2

這不是管理工作室強迫你聲明它只讀 - 它是規則SQL Server。如果你想要一個可操作的表,那麼你需要創建一個相同類型的本地變量並複製行。 –

回答

1

對不起,他們是READONLY。期。

@Damien指出了一個有效的解決方法:如果你想操縱數據,你需要將它們複製到可編輯的結構,比如表變量或#temp表。哎呀,你甚至可以創建一個單獨的表型,轉儲數據在那裏,和操作是:

CREATE TYPE dbo.Integers AS TABLE(id INT PRIMARY KEY); 
GO 

CREATE PROCEDURE dbo.ProcessIntegers 
    @x dbo.Integers READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @y dbo.Integers; 

    INSERT @y SELECT id FROM @x; 

    UPDATE @y SET id += 1; 

    SELECT id FROM @y; 
END 
GO 

DECLARE @z dbo.Integers; 
INSERT @z VALUES(1),(2); 
EXEC dbo.ProcessIntegers @x = @z; 

雖然有一個額外的數據複製那裏,這仍然給你傳遞TVP擺在首位的好處,允許您操縱它。

想了解更多背景和變通辦法的更多詳細信息?請閱讀this article by Erland Sommarskog,可能還有this one too

哦,請發表評論,並投票支持此連接項目,呼籲反對臺灣居民入境許可證進行DML的能力:

Connect #299296 : Relax restriction that table parameters must be readonly when SPs call each other

相關問題