0

3列のテーブルがあります

KeyID | nvarchar(10)  
ColumnA | nvarchar(max)  
ColumnB | Nvarchar(max)

私がやろうとしているのはselectinsertですが、keyIDを使用すると、それをインデント列のように扱う必要があります。

たとえば、3行ある場合、挿入したいのは次のようになります。

1001 | アップル| 梨  
1002 | 梨| マンゴー  
1003 | パイナップル| 松

しかし、私は挿入選択を使用してこれを実行しようとしています。たとえば、次のようになります。

insert into myTable(KeyId,ColumnA,ColumnB) select 'x',OrigColA,OrigColB from myTableB

明らかに「x」は私が問題を抱えているところです。

前もって感謝します!

これはmyTableBにあるKeyIdではありません

4

2 に答える 2

1

これはvarcharのために少し醜いですが、試すことができます:

;WITH x AS
(
  SELECT ROW_NUMBER() OVER(ORDER BY OrigColA, OrigColB) AS n, OrigColA, OrigColB
  FROM myTableB
)
INSERT INTO myTable(KeyId, ColumnA, ColumnB)
SELECT (SELECT CAST(CAST(MAX(KeyId) AS INT) + n AS NVARCHAR(10)) FROM myTable),
    OrigColA, OrigColB
FROM x;

もちろん、これはmyTable、現在の最大値を取得するための行がすでに存在することを前提としています。

SQLフィドルの例

それが常に当てはまるとは限らない場合は、aと、開始時のデフォルトより1少ない定数でラップMAX(KeyId)します。COALESCE例えば:

;WITH x AS
(
  SELECT ROW_NUMBER() OVER(ORDER BY OrigColA, OrigColB) AS n, OrigColA, OrigColB
  FROM myTableB
)
INSERT INTO myTable(KeyId, ColumnA, ColumnB)
SELECT (SELECT CAST(CAST(COALESCE(MAX(KeyId),1000) AS INT) + n AS NVARCHAR(10)) FROM myTable),
    OrigColA, OrigColB
FROM x;

または、行がないことがわかっていて、定数から始めたい場合は、次のようにします。

INSERT INTO myTable(KeyId, ColumnA, ColumnB)
SELECT ROW_NUMBER() OVER(ORDER BY OrigColA, OrigColB) + 1000, OrigColA, OrigColB
FROM myTableB
于 2012-11-08T18:54:07.250 に答える
0

シーケンスを含むデータベースが必要です。ここにSQLサーバーの回避策があります

http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server

于 2012-11-08T19:02:01.453 に答える