none
怎样才能将value2也output入@tableB中 RRS feed

  • 问题

  • declare @tableA table(value1 int)
    declare @tableB table(value1 int,value2 int)
    declare @tableC table(value1 int,value2 int)
    
    insert @tableC
    select 1,2 union all select 2,3
    union all
    select 2,5 union all select 3,4
    
    insert @tableA output inserted.value1/*,value2*/ into @tableB
    select value1 from @tableC c
    
    怎样才能将value2也output入@tableB中
    2010年8月2日 3:13

答案

  • output 后面的inserted字段来自于你插入的数据,如果插入都没当然无法使用这个字段。

     

    要么你把这个字段加上(我之前的办法),要么你换其他方式:

    先保存到tableB,然后在和C表连接把C的其他字段查询出来。不过这个要求插入的字段是pk或者具有唯一索引,否则也不行。

     


    family as water
    2010年8月3日 8:27

全部回复

  • declare @tableA table(value1 int,value2 int)
    declare @tableB table(value1 int,value2 int)
    declare @tableC table(value1 int,value2 int)
    
    insert @tableC
    select 1,2 union all select 2,3
    union all
    select 2,5 union all select 3,4
    
    insert @tableA 
    	output inserted.value1,inserted.value2 into @tableB
    select value1,value2 
    from @tableC c
    
    

    问题在于你insert的表本来就只有一个字段,并且你插入的数据源c也只有一个字段,所有无法将第二个字段的值取出

    按照上面的修改就可以实现你的需求。

     


    family as water
    2010年8月2日 4:09

  • 你的inserted表里按你的插入需求的话 因为@tableA表结构的原因 只能一行只有一列值..无法满足你的一行2列插入@tableB的需求

    你这样的需求 我觉得应该做个触发器

    CREATE TABLE tableA(value1 int)
    CREATE TABLE tableB(value1 int,value2 int)
    CREATE TABLE tableC(value1 int,value2 int)
    
    insert tableC
    select 1,2 union all select 2,3
    union all
    select 2,5 union all select 3,4
    go
    CREATE  TRIGGER trIns ON tableA
    AFTER INSERT 
    AS
    BEGIN 
    	INSERT tableB
    	SELECT DISTINCT c.* 
    	FROM inserted d JOIN tableC c ON d.value1=c.value1
    END
    GO 
    insert tableA 
    select value1 from tableC
    
    SELECT * FROM tableB 
    /*
    value1 value2
    ------ ------
       1   2
       2   3
       2   5
       3   4
    */
    
    DROP TABLE TABLEA,TABLEB,TABLEC 
    
    
    2010年8月2日 5:03
  • create table tableA(value1 int)
    go
    
    create proc proc1 as
    begin
    	declare @tableC table(value1 int,value2 int)
    
    	insert @tableC
    	select 1,2 union all select 2,3
    	union all
    	select 2,5 union all select 3,4
    
    	declare @tableB table(value1 int,value2 int)
    
    	insert tableA output inserted.value1/*,value2*/ into @tableB
    		select value1 from tableC c
    end
    

    补充一下:

    tableA是一个表(不是表变量或临时表),不需要其他字段,只有value1

    @tableC是一个表变量,在存储过程中,本身储有数据,这里只是用简单语句代替(实际不是这么简单)

    2010年8月2日 6:00

  • 你的inserted表里按你的插入需求的话 因为@tableA表结构的原因 只能一行只有一列值..无法满足你的一行2列插入@tableB的需求

    你这样的需求 我觉得应该做个触发器

    CREATE TABLE tableA(value1 int)
    CREATE TABLE tableB(value1 int,value2 int)
    CREATE TABLE tableC(value1 int,value2 int)
    
    insert tableC
    select 1,2 union all select 2,3
    union all
    select 2,5 union all select 3,4
    
    go
    
    CREATE TRIGGER trIns ON tableA
    AFTER INSERT 
    AS
    BEGIN 
    	INSERT tableB
    	SELECT DISTINCT c.* 
    	FROM inserted d JOIN tableC c ON d.value1=c.value1
    END
    GO 
    
    insert tableA 
    select value1 from tableC
    SELECT * FROM tableB 
    /*
    value1 value2
    ------ ------
      1  2
      2  3
      2  5
      3  4
    */
    
    DROP TABLE TABLEA,TABLEB,TABLEC 
    
    
    
    

    我说得不太正确,其实tableC是储存过程一个表变量,因此不能传入触发器
    2010年8月2日 6:05
  • declare @tableA table(value1 int,value2 int)
    
    declare @tableB table(value1 int,value2 int)
    
    declare @tableC table(value1 int,value2 int)
    insert @tableC
    select 1,2 union all select 2,3
    union all
    select 2,5 union all select 3,4
    
    insert @tableA 
    	output inserted.value1,inserted.value2 into @tableB
    select value1,value2 
    from @tableC c
    

    问题在于你insert的表本来就只有一个字段,并且你插入的数据源c也只有一个字段,所有无法将第二个字段的值取出

    按照上面的修改就可以实现你的需求。

     


    family as water

    我说得不太正确,其实tableA是基表,不能这么修改。而且这么做不太现实,如果要是:output inserted.value1,inserted.value2,inserted.value3,inserted.value4,inserted.value5 ... into @tableB,这时就要加多几个字段,并且实际上只是这里用到,没有其他用途!!
    2010年8月2日 6:10
  • create table tableA(value1 int)
    
    go
    
    
    
    create proc proc1 as
    
    begin
    
    	declare @tableC table(value1 int,value2 int)
    
    
    
    	insert @tableC
    
    	select 1,2 union all select 2,3
    
    	union all
    
    	select 2,5 union all select 3,4
    
    
    
    	declare @tableB table(value1 int,value2 int)
    
    
    
    	insert tableA output inserted.value1/*,value2*/ into @tableB
    
    		select value1 from tableC c
    
    end
    
    

    补充一下:

    tableA是一个表(不是表变量或临时表),不需要其他字段,只有value1

    @tableC是一个表变量,在存储过程中,本身储有数据,这里只是用简单语句代替(实际不是这么简单)

    非得使用Output么/?分开写不是也可以达到你需求么?

     

    create proc proc1 as
    begin
     declare @tableC table(value1 int,value2 int)
    
     insert @tableC
     select 1,2 union all select 2,3
     union all
     select 2,5 union all select 3,4
    
     declare @tableB table(value1 int,value2 int)
    
     insert @tableB 
      SELECT * from @tableC 
      
      INSERT TABLEA
      SELECT value1 FROM @tableC 
    END
    
    
    
    2010年8月2日 6:12
  • 呵呵,Sorry,我写得有点简略,问题不是这么简单的,其实还需要插入tableA的主键。。。,由于主键是自动生成的,只有插入后才能取得,所以不能这么做...
    
    create table tableA(id identity(1,1) int primary key,value1 int)
    go
    
    create proc proc1 as
    begin
    declare @tableC table(value1 int,value2 int)
    
    insert @tableC
    select 1,2 union all select 2,3
    union all
    select 2,5 union all select 3,4
    
    declare @tableB table(value1 int,value2 int,value3 int)
    
    insert tableA output inserted.id,inserted.value1/*,value2*/ into @tableB
    select value1 from tableC c
    end
    
    简单来说要实现的是:insert tableA output inserted.tableAID,tableB. ... into @tableB select ... from tableB
    
    可惜不能 output tableB. ... ,语法错误
    2010年8月3日 2:46
  • output 后面的inserted字段来自于你插入的数据,如果插入都没当然无法使用这个字段。

     

    要么你把这个字段加上(我之前的办法),要么你换其他方式:

    先保存到tableB,然后在和C表连接把C的其他字段查询出来。不过这个要求插入的字段是pk或者具有唯一索引,否则也不行。

     


    family as water
    2010年8月3日 8:27
  • 为啥不换个思路?把 @tableA 和 @tableC 对换一下位置不就行了么?

    insert @tableB output inserted.value1/*,value2*/ into @tableA
    select value1,value2 from @tableC c
    

    2020年12月30日 0:48