以编程方式将行插入表中

时间:2017-04-11 00:26:31

标签: sql-server tsql sql-server-2008-r2

我正在尝试编写一个过程来检查表中的所有行,如果B那么我需要在表中插入一个新行。我已经生成了这个脚本,但是当我尝试执行它时出现错误

  

第15行,第15行,第1行,第33行   关键字“选择”附近的语法不正确。

如何改变它以成为有效的t-sql,或者什么是更合适的方法来实现我想要的结果?样本DDL如下:

A = pd.DataFrame(range(3), columns=['dataA'], index=['A0', 'A1', 'A2'])
print A

    dataA
A0      0
A1      1
A2      2

mindex = pd.MultiIndex.from_tuples([
    ('A0', 'B0'), ('A0', 'B1'), ('A1', 'B0'), 
    ('A2', 'B0'), ('A2', 'B1'), ('A2', 'B3')])
B = pd.DataFrame(range(6), columns=['dataB'], index=mindex)
print B

       dataB
A0 B0      0
   B1      1
A1 B0      2
A2 B0      3
   B1      4
   B3      5

A = construct_position_indexes(A, B)
print A

    dataA  start_index  end_index
A0      0            0          2
A1      1            2          3
A2      2            3          6

C = A.iloc[[0, 2], :]
print C

    dataA  start_index  end_index
A0      0            0          2
A2      2            3          6

print get_slice(B, C)

       dataB
A0 B0      0
   B1      1
A2 B0      3
   B1      4
   B3      5

3 个答案:

答案 0 :(得分:3)

首先,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'

答案 1 :(得分:0)

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

答案 2 :(得分: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