【问题标题】:SQL insert into select auto increment variableSQL插入选择自动增量变量
【发布时间】:2017-05-22 07:06:37
【问题描述】:

我是 SQL 新手。请多多包涵。谢谢

我想在表名t1 中插入记录,其中一些字段在 这些记录来自临时表@t2

create table t1
(
    transid             varchar(15) not null primary key,
    content             varchar(1000),
    userid              int not null,
    dtcreate            datetime not null,
)

DECLARE @seqno INT = 1;

DECLARE @t2 TABLE ( userid INT, content VARCHAR(1000), dtcreate DATETIME)

假设我在@t2 中有 10 条记录

我想将@t2(临时表)中的所有记录插入到t1中

INSERT INTO t1 (transid,content,userid,dtcreate)
SELECT (CONVERT(VARCHAR(10), dtcreate, 112)+RIGHT('0000'+CONVERT(VARCHAR, ( 
@seqno =+ 1)), 5)) , content, userid, dtcreate FROM @t2

这是@seqno =+ 1 不允许我这样做的地方。如果我想要这样的东西,我该怎么做?多谢你们。我是超级新手。

【问题讨论】:

  • 创建一个序列,并在插入语句中从中选择下一个值以生成增量值。
  • 提供表定义的工作做得很好,如果有示例记录的 INSERT 就更好了。

标签: mysql sql sql-server tsql


【解决方案1】:

好像ROW_NUMBER 可以做到这一点。

一个抽象的例子:

DECLARE @T1 TABLE (ID INT)
DECLARE @T2 TABLE (ID INT, VALUE INT)
INSERT INTO @T1 VALUES (1), (4)
INSERT INTO @T2 SELECT *, (ROW_NUMBER() OVER(ORDER BY ID))+100 FROM @T1
SELECT * FROM @T1
SELECT * FROM @T2

将其应用于您的代码:

declare @t1 table
(
    transid             varchar(15) not null primary key,
    content             varchar(1000),
    userid              int not null,
    dtcreate            datetime not null
)

DECLARE @t2 TABLE ( userid INT, content VARCHAR(1000), dtcreate DATETIME)

INSERT INTO @t1 (transid,content,userid,dtcreate)
SELECT (CONVERT(VARCHAR(10), dtcreate, 112)+RIGHT('0000'+CONVERT(VARCHAR, ( 
row_number() over(order by userid))+100), 5)) , content, userid, dtcreate FROM @t2

我认识到的一个问题是,您不能省略 ORDER BY,希望这不是问题。

【讨论】:

    【解决方案2】:

    使用ROW_NUMBER

    示例:

                DECLARE @t2 TABLE
                    (
                      content VARCHAR(10) ,
                      userid INT ,
                      dtcreate DATETIME
                    )
    
    
                INSERT  INTO @t2
                        ( content, userid, dtcreate )
                VALUES  ( 'A', 20, '2017.01.01' ),
                        ( 'B', 21, '2017.01.02' ),
                        ( 'C', 22, '2017.01.03' ),
                        ( 'D', 23, '2017.01.04' )
    
                ;
        WITH    CTE
                  AS ( SELECT   ctr ,
                                content ,
                                userid ,
                                dtcreate
                       FROM     ( SELECT    ROW_NUMBER() OVER ( ORDER BY userid ASC ) ctr ,
                                            content ,
                                            userid ,
                                            dtcreate
                                  FROM      @t2
                                ) T
                     )
            ---INSERT  INTO t1
            ---     ( transid ,
            ---       content ,
            ---       userid ,
            ---       dtcreate
            ---     )
                    SELECT  ( CONVERT(VARCHAR(10), dtcreate, 112) + RIGHT('0000'
                                                                      + CONVERT(VARCHAR, ctr),
                                                                      5) ) transid ,
                            content ,
                            userid ,
                            dtcreate
                    FROM    CTE
    

    结果:

            transid         content    userid      dtcreate
            --------------- ---------- ----------- -----------------------
            2017010100001   A          20          2017-01-01 00:00:00.000
            2017010200002   B          21          2017-01-02 00:00:00.000
            2017010300003   C          22          2017-01-03 00:00:00.000
            2017010400004   D          23          2017-01-04 00:00:00.000
    

    【讨论】:

      【解决方案3】:

      使用 row_number() 函数代替 @seqno

      INSERT INTO #t1 (transid,content,userid,dtcreate)
      SELECT (CONVERT(VARCHAR(10), dtcreate, 112)+RIGHT('0000'+CONVERT(VARCHAR, ( 
      ROW_NUMBER()over(order by (Select 1)))), 5)) , content, userid, dtcreate FROM @t2
      

      【讨论】:

        【解决方案4】:
        DECLARE @seqno INT = 1;
        
        DECLARE @t2 TABLE ( userid INT, content VARCHAR(1000), dtcreate DATETIME)
        INSERT INTO @t2 ( content, userid, dtcreate )
        SELECT 'AA',1,'2017-01-05'
        SELECT  @seqno = ROW_NUMBER()OVER(Order by  transid)+1 From t1
        
        --SELECT @seqno
        
        INSERT INTO t1 (transid,content,userid,dtcreate)
        SELECT (CONVERT(VARCHAR(10), GETDATE(), 112)+RIGHT('0000'+CONVERT(VARCHAR(50), (@seqno)), 5)) As seqno 
        , content, userid, dtcreate FROM @t2
        
        SELECT * from t1
        

        下面是输出

        transid         content userid  dtcreate
        -------------------------------------------------------
        2017052200001   AA       1      2017-01-05 00:00:00.000
        2017052200002   AA       1      2017-01-05 00:00:00.000
        2017052200003   AA       1      2017-01-05 00:00:00.000
        2017052200004   AA       1      2017-01-05 00:00:00.000
        

        【讨论】:

          【解决方案5】:

          首先你像这样创建你的表

          CREATE TABLE t1 (
            transid INT NOT NULL AUTO_INCREMENT,
            content Varchar(1000),
            userid INT Not Null,
            dtcreate DateTime not null,
            PRIMARY KEY (Transid)
          )
          AUTO_INCREMENT = 1;
          

          以上查询为您的表提供自动增量
          比使用这样的查询

          INSERT INTO t1 (transid,content,userid,dtcreate)
          SELECT transid,content,userid,dtcreate
          FROM @t2
          

          【讨论】:

            猜你喜欢
            • 2016-12-10
            • 2012-08-26
            • 1970-01-01
            • 2016-05-16
            • 1970-01-01
            • 1970-01-01
            • 2018-03-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多