使用每行的新值更新表

时间:2015-03-31 17:59:46

标签: sql sql-server

我需要在表格的前1000行中更新列(datetime的类型)。但是,每增加一行,我必须将GETDATE()增加1秒......类似于DATEADD(ss,1,GETDATE())

我知道如何做到的唯一方法就是这样:

UPDATE tablename
   SET columnname = CASE id
                        WHEN 1 THEN DATEADD(ss,1,GETDATE())
                        WHEN 2 THEN DATEADD(ss,2,GETDATE())
                        ...
                    END

显然这不合理。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

如何使用id而不是常量?

UPDATE tablename
   SET columnname = DATEADD(second, id, GETDATE() )
   WHERE id <= 1000;

如果您想要前1000行(id),但id有差距或其他问题,那么您可以使用CTE

with toupdate as (
      select t.*, row_number() over (order by id) as seqnum
      from tablename
     )
update toupdate
     set columnname = dateadd(second, seqnum, getdate())
     where seqnum <= 1000;

答案 1 :(得分:1)

我不知道您的ID是什么样的,我假设您至少拥有SQL Server 2008,否则ROW_NUMBER()将无效。

注意:我做了前2,向你展示顶级作品。您可以将其更改为前1000个以进行实际查询。

DECLARE @table TABLE (ID int, columnName DATETIME);
INSERT INTO @table(ID)
    VALUES(1),(2),(3);

UPDATE @table
SET columnName =  DATEADD(SECOND,B.row_num,GETDATE())
FROM @table A
INNER JOIN 
            (
            SELECT TOP 2 *, ROW_NUMBER() OVER (ORDER BY ID) row_num
            FROM @table
            ORDER BY ID
            ) B
ON A.ID = B.ID


SELECT *
FROM @table

结果:

ID          columnName
----------- -----------------------
1           2015-03-31 13:11:59.760
2           2015-03-31 13:12:00.760
3           NULL

答案 2 :(得分:-1)

您没有明确说明您正在使用的SQL Server版本,因此我将假设SQL Server 2005或更高版本。我相信 WAITFOR DELAY 命令是一个很好的选择,可以继续为datetime列的每一行添加1秒。

见这个例子:

-- Create temp table
CREATE TABLE #Client  
( 
    RecordID int identity(1,1),
    [Name] nvarchar(100) not null,
    PurchaseDate datetime null
)

-- Fill in temp table with example values
INSERT INTO #Client
VALUES ( 'Jhon', NULL)

INSERT INTO #Client
VALUES ( 'Martha', NULL)

INSERT INTO #Client
VALUES ( 'Jimmy', NULL)


-- Create local variables
DECLARE @currentRecordId int, 
        @currentName nvarchar(100)

-- Create cursor
DECLARE ClientsCursor CURSOR FOR 
SELECT  RecordID,
        [Name]
FROM    #Client

OPEN ClientsCursor

FETCH FROM ClientsCursor INTO @currentRecordId, @currentName

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

    UPDATE  #Client
    SET     PurchaseDate = DATEADD(ss,1,GETDATE())
    WHERE   RecordID = @currentRecordId
    AND     [Name] = @currentName

     WAITFOR DELAY '00:00:01.000'

    FETCH NEXT FROM ClientsCursor INTO @currentRecordId, @currentName

END

CLOSE ClientsCursor;
DEALLOCATE ClientsCursor;

SELECT *
FROM   #Client

结果如下:

1   Jhon    2015-03-31 15:20:04.477
2   Martha  2015-03-31 15:20:05.473
3   Jimmy   2015-03-31 15:20:06.470

希望您觉得这个答案很有帮助

答案 3 :(得分:-2)

这应该是你需要的(至少是指南)

DELIMITER $$  
CREATE PROCEDURE ADDTIME()

BEGIN
  DECLARE i INT Default 1 ;
  simple_loop: LOOP         
     UPDATE tablename SET columnname = DATE_ADD(NOW(), INTERVAL i SECOND) where rownumber = i
     SET i=i+1;
     IF i=1001 THEN
        LEAVE simple_loop;
     END IF;
  END LOOP simple_loop;
END $$

要调用该存储过程,请使用

CALL ADDTIME()