2013-02-28 60 views
1
CREATE TABLE [dbo].[Customer](
    [CusNo] [nvarchar](20) NULL, 
    [CusName] [nvarchar](100) NULL, 
    [DateIn] [nvarchar](12) NULL, 
    [Add1] [nvarchar](255) NULL, 
    [TelNoH] [nvarchar](50) NULL, 
    [TelNoHP] [nvarchar](11) NULL, 
    [DisSR] [nvarchar](50) NULL, 
    [DisSL] [nvarchar](50) NULL, 
    [DisCR] [nvarchar](50) NULL, 
    [DisCL] [nvarchar](50) NULL, 
    [DisAR] [nvarchar](50) NULL, 
    [DisAL] [nvarchar](50) NULL, 
    [ReadSR] [nvarchar](50) NULL, 
    [ReadSL] [nvarchar](50) NULL, 
    [ReadCR] [nvarchar](50) NULL, 
    [ReadCL] [nvarchar](50) NULL, 
    [ReadAR] [nvarchar](50) NULL, 
    [ReadAL] [nvarchar](50) NULL, 
    [PD] [nvarchar](50) NULL, 
    [R] [nvarchar](50) NULL, 
    [L] [nvarchar](50) NULL, 
    [Remarks] [nvarchar](255) NULL, 
    [ConSR] [nvarchar](50) NULL, 
    [ConSL] [nvarchar](50) NULL, 
    [ConCR] [nvarchar](50) NULL, 
    [ConCL] [nvarchar](50) NULL, 
    [ConAR] [nvarchar](50) NULL, 
    [ConAL] [nvarchar](50) NULL, 
    [Lens] [nvarchar](50) NULL, 
    [Frame] [nvarchar](50) NULL, 
    [Amount] [nvarchar](50) NULL, 
    [LastUserUpdate] [nvarchar](15) NULL, 
    [LastUpdateDate] [nvarchar](max) NULL 
) ON [PRIMARY] 

我使用的是Microsoft SQL Server 2008中,和我有一个表Customer其中CustNo列是主键。我有大约30,000行手动输入CustNo。 我想更新所有的CustNo从1开始并连续增加1直到完成记录。SQL服务器:重新安排主键ID,开始用1

什么是我必须使用的SQL查询?

+3

[不良习惯踢:选择错误的数据类型](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the- wrong-data-type.aspx) - 你应该总是使用最合适的数据类型 - 毕竟这就是他们所在的地方!如果你的'CusNo'是一个**数字** - 为什么它存储为'nvarchar(20)'?首先:它应该是一个**数字**数据类型('INT'),其次,将其作为每字符2个字节的Unicode字符串存储是非常低效的......为什么“ DateIn'也是一个字符串? – 2013-02-28 09:32:25

+0

这是另一个程序员设计,现在他们想要升级系统,为什么我需要重新安排一切,包括数据库设计。 – 2013-02-28 09:34:47

+1

@ChinYe告诉你的老板开火'另一个程序员',按照marc_c的建议使用正确的数据类型。 – 2013-02-28 09:45:06

回答

2

您可以在CTE使用ROW_NUMBER

WITH CTE AS 
(
    SELECT CusNo, RN = ROW_NUMBER() OVER (ORDER BY CusNo) 
    FROM dbo.Customer 
) 
UPDATE CTE SET CusNo = RN 

DEMO与简化模型

,但我也强烈建议遵循@marc_c建议使用正确的数据类型。

0

yup follow marcs advise。还有一件事,确保你的列cusno是一个标识列,这样你就不必经历重新整理它的整个过程。