2017-04-11 104 views
1

我正在尝试编写一个程序来检查表中的所有行,并且如果itemID = 'CC100'那么我需要在表中插入一个新行。我已经产生了这个脚本,但是当我尝试执行它以编程方式将行插入表

消息156,级别15,状态1,行中的关键字“选择” 33
附近有语法错误,我得到一个错误。

这应该如何改变成为有效的t-sql,或者什么是更合适的方式来实现我想要的结果?样品DDL低于:

--Create Holding Table 
Declare Table #Items 
(
    itemID varchar(20) 
    ,itemName varchar(100) 
    ,qty int 
    ,storeID int 
) 
--Insert Some Sample Data 
Insert Into #Items (itemID, itemName, qty, storeID) Values 
('CZ100', 'Coke Zero', 4, 123), ('CZ100', 'Coke Zero', 3, 201) 
,('CZ200', 'Cherry Coke Zero', 4, 311), ('CC100', 'Coca-Cola', 6, 400) 
,('CC100', 'Coca-COla', 8, 500) 
--Select data that needs to be split into secondary table 
Select storeID, Qty Into #NeedExtra from #Items WHERE itemID = 'CC100' 
--Declare variables 
Declare @storeID int, @Qty int 
--Create Cursor 
DECLARE cursor1 CURSOR FOR 
--Select statement to insert into variables 
    SELECT 
    storeID, qty 
    FROM #NeedExtra 

    OPEN cursor1 
    --Iterate cursor 
    FETCH NEXT FROM cursor1 INTO @storeID, @qty 
    --Continue as long as cursor is not empty 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    --Insert Values 
    Insert Into #Items (itemID, itemName, qty, storeID) Values 
    Select @storeID, 'CC200', 'Coca-Cola Syrup', @Qty, @storeID FROM #NeedExtra 
    --Grab next item from temp table 
    FETCH NEXT FROM cursor1 INTO @storeID, @qty 

END 
--Close cursor 
CLOSE cursor1 
--Deallocate cursor 
DEALLOCATE cursor1 
--Select statements 
Select * FROM #NeedExtra 
SELECT * FROM #Items 

回答

2

首先,您在while循环中的插入查询不正确。

Insert Into #Items (itemID, itemName, qty, storeID) Values 
Select @storeID, 'CC200', 'Coca-Cola Syrup', @Qty, @storeID FROM #NeedExtra 

没有像Insert into ... values select这样的语法,并且插入的列数不匹配。

如果是正确的,那么值为@storeID, 'CC200', 'Coca-Cola Syrup', @Qty, @storeID的项目将重复多次,等于#NeedExtra

正确的查询是

Insert Into #Items (itemID, itemName, qty, storeID) Values 
('CC200', 'Coca-Cola Syrup', @Qty, @storeID) 

其次,你应该避免使用CURSOR,并通过这种插入查询更改CURSOR循环。

Insert Into @Items (itemID, itemName, qty, storeID) 
Select 'CC200', 'Coca-Cola Syrup', t.Qty, t.storeID 
FROM @Items t WHERE t.itemID = 'CC100' 
+0

一个没有光标的方法。我喜欢这个! – BellHopByDayAmetuerCoderByNigh

0

INSERT INTO SELECT正确的语法不使用values关键字。因此,只需从程序的第33行删除Values关键字即可。

0

我改变了你的代码如下,现在应该工作。

--Create Holding Table 
    Declare @Items As Table 
    (
     itemID varchar(20) 
     ,itemName varchar(100) 
     ,qty int 
     ,storeID int 
    ) 
    --Insert Some Sample Data 
    Insert Into @Items (itemID, itemName, qty, storeID) Values 
    ('CZ100', 'Coke Zero', 4, 123), ('CZ100', 'Coke Zero', 3, 201) 
    ,('CZ200', 'Cherry Coke Zero', 4, 311), ('CC100', 'Coca-Cola', 6, 400) 
    ,('CC100', 'Coca-COla', 8, 500) 
    --Select data that needs to be split into secondary table 
    Select storeID, Qty Into #NeedExtra from @Items WHERE itemID = 'CC100' 
    --Declare variables 
    Declare @storeID int, @Qty int 
    --Create Cursor 
    DECLARE cursor1 CURSOR FOR 
    --Select statement to insert into variables 
     SELECT 
     storeID, qty 
     FROM #NeedExtra 

     OPEN cursor1 
     --Iterate cursor 
     FETCH NEXT FROM cursor1 INTO @storeID, @qty 
     --Continue as long as cursor is not empty 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 
     --Insert Values 
     Insert Into @Items (itemID, itemName, qty, storeID) 
     Select 'CC200', 'Coca-Cola Syrup', @Qty, @storeID FROM #NeedExtra 
     --Grab next item from temp table 
     FETCH NEXT FROM cursor1 INTO @storeID, @qty 

    END 
    --Close cursor 
    CLOSE cursor1 
    --Deallocate cursor 
    DEALLOCATE cursor1 
    --Select statements 
    Select * FROM #NeedExtra 
    SELECT * FROM @Items 
+0

啊 - 菜鸟的错误!谢谢。 – BellHopByDayAmetuerCoderByNigh

+0

如果答案帮助你,你可以给我一个upvote .. :) – Santhosh

相关问题