これは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