Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL中插入多行?_Sql Server_Tsql_Sql Insert - Fatal编程技术网

Sql server 在SQL中插入多行?

Sql server 在SQL中插入多行?,sql-server,tsql,sql-insert,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 -----------------------------

我有包含以下数据的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不是标识列

类似于:

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
比如:

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
或:

UPD:修复了打字错误。谢谢@Hua_Trung的评论

UPD2:添加了ActionTable.Id生成

UPD3:添加了ActionName2或:

UPD:修复了打字错误。谢谢@Hua_Trung的评论

UPD2:添加了ActionTable.Id生成


UPD3:添加ActionName2

这将帮助您创建用于插入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视为标识

如果ActionTable中的ID不是标识: 尝试使用以下查询:

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

这将帮助您创建用于插入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视为标识

如果ActionTable中的ID不是标识: 尝试使用以下查询:

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

使用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)

使用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个这样的查询:插入到ActionTable WindowsRe,ActionName选择Id,从WindowTable(其中OwnerRef=12)添加,插入到ActionTable WindowsRe,ActionName选择Id,从WindowTable(其中OwnerRef=12)更新,插入到ActionTable WindowsRe,ActionName选择Id,从WindowTable中删除,其中OwnerRef=12这是ActionTable的一次性填充吗?或者会重复的内容?ActionTable.Id不是标识列的原因是什么?这可能会影响生成值的方法。因为我正在使用现有数据库,所以决定是将ActionName设置为Add还是Add的规则是什么?更新还是更新?是否总是删除,或者有时删除或删除?您需要添加3个查询,如下所示:插入到ActionTable WindowsRe,ActionName选择Id,从WindowTable添加,其中OwnerRef=12,插入到ActionTable WindowsRe,ActionName选择Id,从WindowTable更新,其中OwnerRef=12,插入到ActionTable WindowsRe,ActionName选择Id,从WindowTable中删除,其中OwnerRef=12这是ActionTable的一次性填充吗?或者会重复的内容?ActionTable.Id不是标识列的原因是什么?这可能会影响生成值的方法。因为我正在使用现有数据库,所以决定是将ActionName设置为Add还是Add的规则是什么?更新还是更新?它总是删除,或者有时删除或删除?回答不错!差点忘了!但是a.Action或a.ActionName??再次感谢,但是如何添加ActionName2列?再次编辑Msg 2627,第14级,状态1,第1行违反唯一键约束“唯一性”。无法在对象“info.ActionTable”中插入重复键。重复的键值是17,Add.nice答案!差点忘了!但是a.Action或a.ActionName??再次感谢,但是如何添加ActionName2列?再次编辑Msg 2627,第14级,状态1,第1行违反唯一键约束“唯一性”。无法在对象“info.ActionTable”中插入重复键。重复的键值是17,Add。感谢您的帮助,但是ActionTable.Id不是我添加的标识列,这是一个新的查询。尝试使用它。谢谢您的帮助,但ActionTable.Id不是我添加的标识列,这是一个新的查询。尽量利用它。