0

我有一个三列的表

密钥ID | nvarchar(10)  
A 栏 | nvarchar(最大值)  
B栏| Nvarchar(最大值)

我想要做的是选择插入,但是使用 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 小提琴示例

如果情况并非总是如此,请MAX(KeyId)使用 aCOALESCE和比您的起始默认值小一的常数进行包装。例如:

;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 server 的解决方法

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

于 2012-11-08T19:02:01.453 回答