我试图从一个单一select语句插入到3个表中。这里是我想要做的事:使用TSQL从单个选择查询插入到2个表中
insert into dbo.temp1 (name, location, city)
select name, location, city from mytable.
我希望能够插入到3个表,一旦我运行SELECT语句,如插入到temp1中,TEMP2和TEMP3。
我该怎么做?谢谢。
我试图从一个单一select语句插入到3个表中。这里是我想要做的事:使用TSQL从单个选择查询插入到2个表中
insert into dbo.temp1 (name, location, city)
select name, location, city from mytable.
我希望能够插入到3个表,一旦我运行SELECT语句,如插入到temp1中,TEMP2和TEMP3。
我该怎么做?谢谢。
没有办法用一个查询插入到X表中(确定它的插入和输出到表)。
所以你必须写3个查询。
或者您可以使用动态查询生成SQL语句。
不能一步到位做到这一点*
你可以做的是插入一个临时区域初始查询到#temp
表(或@table
变量),然后再插入从表中那里。包裹的步骤在一个事务中保留ACID:
BEGIN TRAN
select name, location, city
into #TEMP
from mytable;
insert into temp1(name, location, city)
select name, location, city
from #TEMP;
-- Same for temp2 and temp3.
COMMIT TRAN
*
排除黑客如用触发器相反-的视图。
从并发的角度来看,登台表很重要,因为如果对源表进行临时并发更改,重复原始查询3次可能会导致不同的结果。
我不相信你可以在一个语句中插入多个表。但是,您绝对可以在一次交易中完成。
BEGIN TRANSACTION
INSERT INTO dbo.temp1 (name, location, city)
SELECT name, location, city
FROM myTable
INSERT INTO dbo.temp2 (name, location, city)
SELECT name, location, city
FROM myTable2
COMMIT TRANSACTION
您可以使用输出做最大2表:
insert into dbo.temp1 (name, location, city)
output inserted.name, inserted.location, inserted.city into temp2
select name, location, city from mytable
MySQL不支持多表插入一个INSERT statement。甲骨文是我所知道的唯一一个,奇怪的是......
但是,您可以使用一个交易,并将它们都包含在一个交易中。
的MySQL:
START TRANSACTION;
INSERT INTO table1 VALUES ('1','2','3');
INSERT INTO table2 VALUES ('1','2','3');
COMMIT;
SQL服务器:
BEGIN TRAN;
INSERT INTO table1 VALUES ('1','2','3');
INSERT INTO table2 VALUES ('1','2','3');
COMMIT;
SQL Server和错误捕获/回滚:
BEGIN TRANSACTION [Tran1]
BEGIN TRY
INSERT INTO table1 VALUES ('1','2','3')
INSERT INTO table2 VALUES ('1','2','3')
COMMIT TRANSACTION [Tran1]
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION [Tran1]
END CATCH
GO
可以插入到多个表中使用一个select语句触发。
CREATE TRIGGER TEMP2_TEMP3_INSERT ON TEMP1
AFTER INSERT AS
BEGIN
/* create your insert statements for TEMP2 and TEMP3 here
referencing the data from the first insert */
END;
GO
您可以。 有一招。
创建一个视图,然后创建一个'而不是'触发器插入到该视图中插入东西到您的表中。如果您现在插入到您的视图中,则最终将数据插入3个表格中。这是演示
-- 1. create 3 test tables
create table t1(id int, f1 varchar(20))
create table t2(id int, f2 varchar(20))
create table t3(id int, f3 varchar(20))
go
-- 2. create the view
create view Tt as
select t1.ID, t1.f1, t2.f2,t3.f3
from t1
join t2 on t1.ID=t2.ID
join t3 on t1.ID=t3.id
go
-- 3. create the trigger
create trigger Tr_Test on Tt INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
insert into t1 select id,f1 from inserted
insert into t2 select id,f2 from inserted
insert into t3 select id,f3 from inserted
END
GO
-- 4. now do your insert with a single select
insert into tt
select 1,'A','B','C'
-- 5. and watch the 3 tables
select * from t1
select * from t2
select * from t3
voilá,一个插入,3个表被修改。我们不计算隐藏的触发器,我们;-)
你能确定表的数量吗?问题标题提到了两个,身体提到了三次。 – HABO
每次将数据添加到temp1时,是否总是希望将数据添加到这三个表中?如果是这样,可以使用触发器。 – Mackers