在SQL中插入多行?

时间:2017-03-28 08:14:41

标签: sql-server tsql sql-insert

我的WindowTable包含以下数据:

SELECT  Id FROM WindowTable WHERE OwnerRef=12

 Id
----
25000
25001
25003
25004
25005
25006
25007
25008

我想在ActionTable中为每个WindowTable行插入3行 像这样:

Id    WindowsRef     ActionName     ActionName2     

-----------------------------------------------
1       25000          'Add'          'E'
2       25000          'DELETE'       'H'
3       25000          'UPDATE'       'B'  
4       25001          'ADD'          'E'
5       25001          'DELETE'       'H' 
6       25001          'Update'       'B'
.         .              .
.         .              .

ActionTable.Id不是标识列

5 个答案:

答案 0 :(得分:6)

或者:

insert into ActionTable (Id, WindowsRe, ActionName, ActionName2)
select
   isnull((select max(at.Id) from ActionTable at), 0) +
   row_number() over (order by w.Id, a.Action),
   w.Id, a.Action, a.Action2
from WindowsTable w
cross join
(
  select 'Add' as Action, 'E' as Action2
  union all select 'Delete', 'H'
  union all select 'Update', 'B'
) a

UPD :修正了错误的错误。感谢@Hua_Trung发表评论

UPD2 :添加了ActionTable.Id

UPD3 :已添加ActionName2

答案 1 :(得分:4)

类似的东西:

insert into ActionTable(WindowsRef, ActionName)
select id WindowsRef, 'Add'
  from WindowsTable
union all
select id WindowsRef, 'DELETE'
  from WindowsTable
union all
select id WindowsRef, 'UPDATE'
  from WindowsTable

(假设ActionTable.Id是一个标识列或以其他方式生成数据库。)

同时生成id个值

insert into ActionTable(id, WindowsRef, ActionName)
select
    (isnull(select max(id) from ActionTable, 0)
        + row_number() over (order by x.WindowsRef, x.ActionName)
    ) id,
    x.WindowsRef, x.ActionName
from (
    select id WindowsRef, 'Add' ActionName
      from WindowsTable
    union all
    select id WindowsRef, 'DELETE' ActionName
      from WindowsTable
    union all
    select id WindowsRef, 'UPDATE' ActionName
      from WindowsTable
) x

答案 2 :(得分:3)

使用apply的另一种方法。使用Praveen ND的样本数据

select *,row_number() over (order by id) as id from @WindowTable
cross apply
(
values('add','E'),
      ('delete','h'),
      ('update','b')
)b(action,action2)

答案 3 :(得分:2)

这将帮助您创建插入ActionTable的脚本

DECLARE @WindowTable TABLE (ID INT)
INSERT INTO @WindowTable VALUES
(25001),
(25003),
(25004),
(25005),
(25006),
(25007),
(25008)

SELECT 'INSERT INTO ActionTable (WindowsRe,ActionName) VALUES ('+ CAST(ID AS NVARCHAR(MAX))+',ADD)' FROM @WindowTable
UNION
SELECT 'INSERT INTO ActionTable (WindowsRe,ActionName) VALUES ('+ CAST(ID AS NVARCHAR(MAX))+',UPDATE)' FROM @WindowTable
UNION
SELECT 'INSERT INTO ActionTable (WindowsRe,ActionName) VALUES ('+ CAST(ID AS NVARCHAR(MAX))+',DELETE)' FROM @WindowTable

注意:将ActionTable中的ID视为IDENTITY。

如果ActionTable中的ID不是IDENTITY: 尝试使用下面的查询:

DECLARE @WindowTable TABLE (ID INT)
INSERT INTO @WindowTable VALUES
(25001),
(25003),
(25004),
(25005),
(25006),
(25007),
(25008)

DECLARE @id INT =1;
DECLARE @id1 INT = (SELECT COUNT(*) FROM @WindowTable)
DECLARE @id2 INT = (SELECT 2 *COUNT(*) FROM @WindowTable)


SELECT 'INSERT INTO ActionTable (ID,WindowsRe,ActionName,ActionName2) VALUES ('+CAST(ROW_NUMBER() OVER(ORDER BY @id) AS NVARCHAR(MAX))+','+ CAST(ID AS NVARCHAR(MAX))+',ADD,''E'')' FROM @WindowTable
UNION
SELECT 'INSERT INTO ActionTable (ID,WindowsRe,ActionName,ActionName2) VALUES ('+CAST(@id1+ ROW_NUMBER() OVER(ORDER BY @id1) AS NVARCHAR(MAX))+','+ CAST(ID AS NVARCHAR(MAX))+',UPDATE,''B'')' FROM @WindowTable
UNION
SELECT 'INSERT INTO ActionTable (ID,WindowsRe,ActionName,ActionName2) VALUES ('+CAST(@id2+ ROW_NUMBER() OVER(ORDER BY @id2) AS NVARCHAR(MAX))+','+ CAST(ID AS NVARCHAR(MAX))+',DELETE,''H'')' FROM @WindowTable

答案 4 :(得分:2)

希望这有帮助

测试数据

;WITH cte_TestData(WindowsRef) AS
(
SELECT 25000 UNION ALL
SELECT 25001 UNION ALL
SELECT 25003 UNION ALL
SELECT 25004 UNION ALL
SELECT 25005 UNION ALL
SELECT 25006 UNION ALL
SELECT 25007 UNION ALL
SELECT 25008
)
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID,
    a.WindowsRef,
    b.ActionName,
    b.ActionName2
FROM cte_TestData a
CROSS JOIN (
    SELECT 'Add' AS ActionName,'E' AS ActionName2   UNION ALL
    SELECT 'DELETE','H' UNION ALL
    SELECT 'UPDATE','B') b
ORDER BY a.WindowsRef

针对实际数据

;WITH cte_TestData(WindowsRef) AS
(
SELECT  Id
FROM WindowTable 
WHERE OwnerRef=12
)
,cte_Action AS
(
SELECT 'Add' AS ActionName,'E' AS ActionName2   UNION ALL
SELECT 'DELETE','H' UNION ALL
SELECT 'UPDATE','B'
)
--INSERT INTO <DestinationTable> 
/* 
- Replace <DestinationTable> with Target Table Name 
- If the destination table has data the the ID has to be incremented accordingly. 
-- In that case define a variable, get MAX of that ID and add that to the below 
   auto generated ID to preserve the sequence. 
--Better yet, use Identity column as your ID Column
*/
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID,
    a.WindowsRef,
    b.ActionName,
    b.ActionName2
FROM cte_TestData a
CROSS JOIN cte_Action b
--WHERE NOT EXISTS (SELECT 1 FROM <DestinationTable> c WHERE c.WindowsRef = a.WindowsRef) 
/* 
Enable to ensure duplicate records are not inserted, Replace <DestinationTable> with Target Table Name 
*/
ORDER BY a.WindowsRef