【问题标题】:Populate new ID Column with Sequential Identifiers使用顺序标识符填充新 ID 列
【发布时间】:2015-07-18 19:58:00
【问题描述】:

我需要使用从“PM1000000000”开始的唯一序列填充列 nvarchar(12),并为每行增加 1。没有标识列或主键(编辑)可以循环,这使得这个问题非常具有挑战性,因为我发现的大多数示例都使用标识列来循环

我在 MSDN 上的 https://support.microsoft.com/en-us/kb/111401 找到了一个示例,示例 3,但它没有显示增加一行

谁能帮我填充这个字段,以便我可以把它作为主键?注意:这个表有 6000 万行,但我现在愿意接受任何想法来让它工作

【问题讨论】:

标签: sql-server tsql sql-server-2005


【解决方案1】:

你可以使用ROW_NUMBER():

SELECT
    ID = 'PM' + CONVERT(NVARCHAR(10), ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + 1000000000 - 1)
FROM <YourTable>

UPDATE声明

;WITH Cte AS(
    SELECT *,
        RN = 'PM' + CONVERT(NVARCHAR(10), ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + 1000000000 - 1)
    FROM TestData
)
UPDATE Cte SET ID = RN

【讨论】:

  • Thx 但这只是选择记录。我需要使用创建的 ID 更新行
  • 然后将其转换为UPDATE 语句。
  • 转换为更新,然后你得到:Msg 4108, Level 15, State 1, Line 1 窗口函数只能出现在 SELECT 或 ORDER BY 子句中
  • @user1438150,由于ROW_NUMBER1开始,我们必须减去1,这样新的id就会从PM1000000000开始。
  • @user1438150,对于WITH前的分号;,要求CTE声明前的语句,必须以;结束。有些人喜欢以; 开始他们的CTE 声明,而不是终止之前的声明。但我建议后者。
【解决方案2】:

您可以使用光标。不过会很慢。我已经将游标用于具有~1MM 记录但不是 60MM 的数据表。您可以在此处找到光标示例。

https://msdn.microsoft.com/en-us/library/ms180169.aspx

【讨论】:

  • 就速度而言,这与 wewestthemenace 的答案相比如何?
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多