您需要的是表值參數作爲存儲過程的輸入(update_product_xml_single_id)。因此,不是傳遞int類型的標量值(@Id),而是傳遞一個列表(比如@TVP),其中包含您當前正在處理的來自OP中表「table」的所有ID。在你的存儲過程中,你可以像使用其他普通表一樣使用該表變量@TVP。
此鏈接顯示瞭如何用一個例子做(我抄這個例子樓下):
USE AdventureWorks2012;
GO
-- Step 1
/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE
(LocationName VARCHAR(50)
, CostRate INT);
GO
-- Step 2
/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE dbo. usp_InsertProductionLocation
@TVP LocationTableType READONLY
AS
BEGIN
SET NOCOUNT ON
INSERT INTO AdventureWorks2012.Production.Location
(Name
,CostRate
,Availability
,ModifiedDate)
SELECT *, 0, GETDATE()
FROM @TVP;
END
GO
用法:從上面的MSDN鏈接
https://msdn.microsoft.com/en-us/library/bb510489.aspx?f=255&MSPPError=-2147217396
例通過TVP到存儲過程:
/* Declare a table variable that references the type. */
DECLARE @LocationTVP AS LocationTableType; -- This was created in Step 1 above.
/* Add data to the table variable. So this would be the same as your Declare Cursor SQL except its inserting into a Table Valued Parameter @LocationTVP */
INSERT INTO @LocationTVP (LocationName, CostRate)
SELECT Name, 0.00
FROM AdventureWorks2012.Person.StateProvince;
/* Pass the table variable data in @LocationTVP to a stored procedure that now expects a Table valued parameter as input */
EXEC usp_InsertProductionLocation @LocationTVP;
GO
編輯:
我只是測試你創建SP代碼,它工作得很好,這是我試過
CREATE TYPE IdTableType AS TABLE ([Id] VARCHAR(20) NOT NULL);
GO
-- Modified old stored proc: update_product_xml_single_id, to receive the new type
CREATE PROCEDURE update_product_xml_tvp
(@id IdTableType READONLY)
AS
BEGIN
SELECT * FROM @id --- Obviously you will be using it differently but this is just to prove that it works
END
也是「INTO」缺少在INSERT語句中
這:
INSERT @ID
SELECT DISTINCT ID
FROM Products
WHERE ID LIKE 'N0%'
ORDER BY ID;
應該是
INSERT INTO @ID
SELECT DISTINCT ID
FROM Products
WHERE ID LIKE 'N0%'
ORDER BY ID;
我將INTO部分添加到了我的代碼中。但它仍然給我同樣的錯誤。 我想確保您知道存儲的proc update_product_xml_tvp 與我在CURSOR中使用的存儲過程相同,我在其中更改的唯一內容是輸入參數類型。它曾經是: @pf_id VARCHAR(100)
,現在是: @Id ID READONLY
由於我沒有在該過程中的代碼修改的東西,錯誤來自於像部分: WHERE ai.ID = @id
東西看起來不正確,就像@id不再是與ai.id相同的數據類型,因此比較不再有效,但我不知道如何糾正它,或在哪裏。
因此,要確保這是正確的,我結束了
1. A user defined table type named id
CREATE TYPE idTableType AS TABLE ([some_id] VARCHAR(20) NOT NULL);
2. A stored procedure that populates that table type:
CREATE PROC [dbo].[mn_pass_id_table] (@id_spVariable idTableType READONLY)
AS
BEGIN
SET NOCOUNT ON
SELECT DISTINCT ID
FROM Products
WHERE ID LIKE 'N0%'
ORDER BY ID;
END
3. And a modification to the stored procedure that existed already.
From:
ALTER PROCEDURE update_product_xml_single (@id VARCHAR(100))
To:
ALTER PROCEDURE update_product_xml_tvp (@id_spVariable idTableType READONLY)
這裏面的程序也有,我沒有改變,也沒有改裝4個WHERE條件和正在給我的錯誤,不會讓我更新的存儲過程:
WHERE ai.ID IN (Select some_id from @id_spVariable )
我的理解是,在年底,我將能夠做到從一個新的查詢窗口如下:
DECLARE @ID_Var_That_We_Will_Pass_To_Your_SP as idTableType
INSERT INTO @ID_Var_That_We_Will_Pass_To_Your_SP
SELECT SOME_COLUMN FROM REAL_TABLE (This will be the one that you currently use to Declare the Cursor)
EXEC update_product_xml_tvp @ID_Var_That_We_Will_Pass_To_Your_SP
我相信我在這裏搞點東西。我真的想把它做對。感謝您的耐心和幫助。
謝謝objectNotFound,我在代碼中實現更改有點困惑,但我會試一試。 –
@erasmocarlos它非常直截了當......我複製/粘貼的例子中的最後3個語句在SP之外。我將編輯帖子以澄清這一點。 – objectNotFound
第一部分第二步,爲什麼插入從命名爲Location的表中獲取數據,然後在插入語句的最後三個語句中,tvp使用來自不同表的數據填充。 –