我有一個接收表作爲參數的過程。我需要填寫它,然後將其返回到執行第一個程序的另一個程序。但是,問題是,當y編譯我收到此錯誤信息:SQL Server中的臨時表和值表參數
男子352 NIVEL 15,埃斯塔1,Procedimiento Person_InsertCloud,拉利內阿1
的表值參數 「@TableServerIds」 必須申報與READONLY選項。
無法修改表格作爲參數嗎?我還有什麼其他選擇?
謝謝
我有一個接收表作爲參數的過程。我需要填寫它,然後將其返回到執行第一個程序的另一個程序。但是,問題是,當y編譯我收到此錯誤信息:SQL Server中的臨時表和值表參數
男子352 NIVEL 15,埃斯塔1,Procedimiento Person_InsertCloud,拉利內阿1
的表值參數 「@TableServerIds」 必須申報與READONLY選項。
無法修改表格作爲參數嗎?我還有什麼其他選擇?
謝謝
一個例子無法一個表作爲一個參數可以被修改?
不是。這是對TVP的限制之一。
的限制是documented:
表值參數必須作爲輸入READONLY參數對Transact-SQL例程傳遞。您無法對例程正文中的表值參數執行DML操作,例如UPDATE,DELETE或INSERT。
而是填充一個表,你可以從你的第二個存儲過程使用SELECT
返回表。
否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