2017-05-22 4 views
2

私はSQLの初心者です。私と一緒に抱きしめてください。ありがとうSQLがselect auto increment変数に挿入されます

レコードをテーブル名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) 

@seqno =+ 1にはない場所です

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 

(一時テーブル)私は、@ t2の中のすべてのレコードに対して、T1に挿入したいのは、私は@t2

に10件のレコードを持っているとしましょう私はそれを可能にします。このようなことをしたいのであれば、どうすればいいですか?みんなありがとう。私は超初心者です。

+0

シーケンスを作成し、insert文で次の値を選択して増分値を生成します。 – Galcoholic

+0

テーブル定義を提供するのにうってつけです。サンプルレコードのINSERTがあった方が良いでしょう。 – KtX2SkD

答えて

0

まずクエリ上でこの

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; 

のようなあなたのテーブルを作成するには、あなたがの代わりにROW_NUMBER()関数を使用して、この

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

のように使用するクエリよりも、あなたのテーブルに
を自動インクリメント与えます@ 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 
0

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 

1つの問題は、あなたがうまくいけば、それは問題ではない、ORDER BYを省略することができないということです。以下は

0
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 
0

使用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 
関連する問題