我有一个包含三列的表
KeyID | nvarchar(10) ColumnA | nvarchar(max) ColumnB | Nvarchar(max)
我要做的是选择插入,但是使用keyID我需要将其视为一个缩进列。
例如,如果我有3行,我想插入它将是:
1001 | Apple | Pear 1002 | Pear | Mango 1003 | Pineapple | Pine
但我正在尝试使用插入选择来执行此操作,例如:
insert into myTable(KeyId,ColumnA,ColumnB) select 'x',OrigColA,OrigColB from myTableB
显然'x'是我遇到问题的地方。
提前致谢!
这不是myTableB中的KeyId
答案 0 :(得分: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
中已有一行来获取当前的最大值。
如果情况并非总是如此,请将MAX(KeyId)
用COALESCE
包裹,并将常数1设为小于起始默认值。例如:
;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
答案 1 :(得分:0)
你需要一个包含序列的数据库。继承人sql server的解决方法
http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server