SQL Server 2008 - 一种使用上升整数填充列的聪明方法

时间:2010-04-16 22:11:28

标签: sql sql-server

我正在研究一个数据库,我想要做的是创建一个带有ID(自动增量)的表和另一列:“数字”(我意识到这听起来没用,但请耐心等待我),我需要填充此“数字”列,其值为1到180,每次加1为前一个。

这样做的一种聪明的“自动”方法是什么?

7 个答案:

答案 0 :(得分:3)

创建一个包含所需列的表(ID,数字)并将ID设置为自动递增。完成后,使用一段时间加载最多180个。

这是CREATE TABLE

CREATE TABLE [dbo].[<YOUR TABLE>](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Number] [int] NULL
) ON [PRIMARY]

这是INSERT

INSERT INTO <YOUR TABLE> (Number) VALUES (1);

WHILE SCOPE_IDENTITY() < 180
BEGIN
    INSERT INTO <YOUR TABLE> (Number) VALUES (SCOPE_IDENTITY()+1);
END

答案 1 :(得分:3)

创建要更新的列0然后您可以简单地:

DECLARE @id INT = 0
UPDATE tbl
   SET @id = id = (@id % 180 + 1)

只是为了增加删除% 180

答案 2 :(得分:2)

在transact SQL中,一个简单的更新应该让你想要

create table table_x ( A char(1), B int NULL )


declare @i int
select @i = 1

update table_x
set B=@i, @x=@i+1
from table_x 

select * from table_x

答案 3 :(得分:1)

如果我理解正确,ROW_NUMBER()应该可以解决你的问题。

示例:

select ROW_NUMBER() OVER(ORDER BY ID) from sysobjects

如果你想要1到180,然后再想1到180:

select ((ROW_NUMBER() OVER(ORDER BY ID)) - 1) % 180 + 1 from sysobjects

更新

update tablename
set number = 
  (select number 
  from
    (select
      id,
      ((ROW_NUMBER() OVER(ORDER BY ID)) - 1) % 180 + 1 number
    from tablename) u
  where u.id = tablename.id)

答案 4 :(得分:0)

WITH n AS(SELECT 0 nUNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)
SELECT n1.n * 100 + n2.n * 10 + n3.n + 1
  FROM n n1 CROSS JOIN n n2 CROSS JOIN n n3
 WHERE n1.n * 100 + n2.n * 10 + n3.n + 1 <= 180

答案 5 :(得分:0)

Itzik Ben-Gan有一个很好的行号生成方法,它不使用表,只使用常量和交叉连接。在我眼里非常优雅。

来自http://www.projectdmx.com/tsql/tblnumbers.aspx#Recur

;WITH Nbrs_3( n ) AS ( SELECT 1 UNION SELECT 0 ),
Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ),
Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ),
Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ),
Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )
SELECT n
FROM ( SELECT ROW_NUMBER() OVER (ORDER BY n)
FROM Nbrs ) D ( n )
WHERE n <= 180 ; -- or any number 

您可以用任何数字替换180。您可以使用生成的插入序列代替选择。

答案 6 :(得分:0)

此查询将更新表中不需要%180的所有记录

    update tableName
    set columnName= 
      (select number
       from
           (select id, ((ROW_NUMBER() OVER(ORDER BY ID))) number
            from TableName ) t
      where t.id = tableName.id)
      go

    select * from tableName order by id
    go