使用TSQL从单个选择查询插入2个表

时间:2015-04-22 18:40:05

标签: sql sql-server tsql

我试图从一个select语句插入3个表。这是我想要做的:

# This is example1.com
@app.route("/api/<projectTitle>/<path:urlSuffix>", methods=['GET'])
def projectTitlePage(projectTitle, urlSuffix):

    projectId = databaseFunctions.getTitleProjectId(projectTitle)
    projectInfo = databaseFunctions.getProjectInfo(projectId)
    redirectionQueryString = re.sub('apikey=[^&]+&?', '', request.query_string).rstrip('&')
    redirectionUrl = projectInfo['secretUrl'].rstrip('/')
    if urlSuffix is not None:
        redirectionUrl += '/' + urlSuffix.rstrip('/')
    redirectionUrl += '/?' + redirectionQueryString
    redirectionHeaders = request.headers

    print request.args.to_dict(flat=False)
    try:
        r = requests.get(redirectionUrl, data=request.args.to_dict(flat=False), headers=redirectionHeaders)
    except Exception, e:
        return '/error=Error: bad secret url: ' + projectInfo.get('secretUrl')

    return r.text

我希望能够在运行select语句时插入3个表,例如插入temp1,temp2和temp3。

我该怎么做?感谢。

6 个答案:

答案 0 :(得分:2)

您无法一步完成*

您可以做的是将初始查询作为临时区域插入#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次可能会导致不同的结果。

答案 1 :(得分:2)

使用输出:

可以最大化2个表
insert into dbo.temp1 (name, location, city)
output inserted.name, inserted.location, inserted.city into temp2
select name, location, city from mytable

答案 2 :(得分:1)

你可以。 随便一招。

创建一个视图,然后在该视图上创建一个'而不是'触发器,用于将内容插入到表中。如果现在插入视图,最后将数据插入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个表被修改。我们不计算隐藏的触发器,我们; - )

答案 3 :(得分:0)

没有办法用一个查询插入X表(好吧它的插入和输出到表)。

所以你必须写3个查询。

或者您可以使用动态查询生成SQL语句。

答案 4 :(得分:0)

我不相信你可以在一个声明中插入多个表格。但是,您肯定可以在一次交易中完成。

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

答案 5 :(得分:0)

MySQL不支持在单个INSERT statement中插入多表。甲骨文是我唯一知道的,奇怪的是......

但是,您可以使用交易并将它们都包含在一个交易中。

MySQL的:

START TRANSACTION;
  INSERT INTO table1 VALUES ('1','2','3');
  INSERT INTO table2 VALUES ('1','2','3');
COMMIT;

SQL Server:

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
相关问题