如何在 SQL Server 中循环遍历 ID 列表

dro*_*ros 0 sql t-sql sql-server

我有一个需要循环遍历的 id 列表,例如在插入语句中使用

我在这里建了表:

DECLARE @ProductIds TABLE (ID nvarchar(1000))

INSERT INTO @ProductIds (ID)
    SELECT ProductTypeId FROM ProductType

DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR 
    SELECT DISTINCT Id 
    FROM @ProductIds

OPEN MY_CURSOR

FETCH NEXT FROM MY_CURSOR INTO @ProductIds

WHILE @@FETCH_STATUS = 0
BEGIN 
    --each so basically each productId is used in the @ProductId parameter below
    INSERT INTO myProducts (ProductTypeId, prodDesc, Value) 
    VALUES (@ProductId, 'CA1BBFC3-35EA-4984-BCD1-9E0EB385E4BE', 0)

    PRINT @ProductIds

    FETCH NEXT FROM MY_CURSOR INTO @ProductIds
END

CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
Run Code Online (Sandbox Code Playgroud)

我不确定问题是否在于语法或我如何尝试做到这一点,但我不断收到错误

消息 137,级别 16,状态 1,第 76 行
必须声明标量变量“@ProductIds”。

消息 137,级别 16,状态 1,第 81 行
必须声明标量变量“@ProductIds”。

消息 137,级别 16,状态 1,第 82 行
必须声明标量变量“@ProductIds”。

我正在学习 SQL,所以我发现它目前是一个很大的挑战

Stu*_*337 5

如果你正在学习 SQL,你应该做的第一件事就是停止考虑循环任何东西。SQL 经过优化,可以对集合进行操作,而不是一次一行。您只需要:

insert dbo.myProducts (ProductTypeId, prodDesc,Value) 
  Select ProductTypeId,'CA1BBFC3-35EA-4984-BCD1-9E0EB385E4BE',0 
  from dbo.ProductType;
Run Code Online (Sandbox Code Playgroud)

虽然这看起来有点乱;ProductId 和 ProductTypeId 之间存在一些混淆,并且您希望为每种产品类型插入具有相同 GUID 描述的产品。但这是避免 70 行代码和低效循环的一般结构。