【问题标题】:sql how to insert into a column like it was an identity columnsql如何插入一个列,就像它是一个标识列
【发布时间】:2012-11-08 18:51:28
【问题描述】:

我有一个三列表格

密钥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

【问题讨论】:

  • 为什么不直接使用 IDENTITY 列呢?为什么要重新发明轮子?

标签: sql sql-server-2008


【解决方案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 和比您的初始默认值小一的常数。例如:

;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

【讨论】:

    【解决方案2】:

    您需要一个带有序列的数据库。这是 sql server 的解决方法

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

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 2018-01-22
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2021-01-24
      • 2016-02-22
      相关资源
      最近更新 更多