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,所以我发现它目前是一个很大的挑战
如果你正在学习 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 行代码和低效循环的一般结构。