您需要将表值参数作为存储过程 (update_product_xml_single_id) 的输入。因此,您将传递一个列表(例如 @TVP ),而不是传递一个 int 类型的标量值,该列表包含您当前从 OP 中的表“table”中处理的所有 ID。在您的存储过程中,您可以像使用任何其他普通表一样使用该表变量@TVP。
此链接向您展示了如何通过示例进行操作(我已在下面复制了该示例):
https://msdn.microsoft.com/en-us/library/bb510489.aspx?f=255&MSPPError=-2147217396
来自上述 msdn 链接的示例:
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
将 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
编辑:
我刚刚测试了您的 CREATE 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 @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 部分添加到我的代码中。但它仍然给我同样的错误。
我想确保您知道存储的过程 update_product_xml_tvp
是与 CURSOR 一起使用的相同存储过程,我唯一更改的是输入参数类型。它曾经是:
@pf_id VARCHAR(100)
现在是:
@id id 只读
由于我没有修改该过程中代码中的任何内容,因此错误来自以下部分:
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
我确定我在这里搞砸了。我真的很想把它做好。感谢您的耐心和帮助。