sql如何插入到列中,就像它是一个标识列一样

时间:2012-11-08 18:51:29

标签: sql sql-server-2008

我有一个包含三列的表

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

2 个答案:

答案 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中已有一行来获取当前的最大值。

SQL Fiddle example

如果情况并非总是如此,请将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