【问题标题】:How can I update each row with a different value?如何使用不同的值更新每一行?
【发布时间】:2014-06-05 00:50:22
【问题描述】:

我认为我可以使用 WHILE LOOP 来做到这一点,但它每次都会更新所有行。

我有一个表,我需要使用应用程序唯一值函数更新两个具有唯一 ID 的字段。该函数给了我一个 GUID (Trans),另一个给了我一个唯一的 Trans_ID。我需要使用这些唯一 ID 更新每一行。

我将更新一行,运行函数以获取下一个唯一数字,然后填充下一行。我不知道该怎么做。

        DECLARE @RowCount as INT
        DECLARE @IntFlag as INT
        SET     @IntFlag = 1
        SELECT  @RowCount = count(*) from trans_periodic_retainer_final
        DECLARE @TransID as char(20)                                    
        DECLARE @BatchID uniqueidentifier
        WHILE   @IntFlag <=@RowCount
        BEGIN

            /* Functions to get the unique values */
            UPDATE Increments SET Increment = Increment+1 WHERE v7Tables = 'Transactions' AND Site = 'TESTSERVER'
            SET @BatchID = newid()
            SELECT @TransID = Increment FROM Increments WHERE v7Tables = 'Transactions'         AND Site = 'TESTSERVER'

            UPDATE Transactions set trans = @BatchId, Trans_id = @TransID

            SET @IntFlag = @intFlag +1
        END

任何帮助将不胜感激。

【问题讨论】:

  • 这些独特的价值从何而来?
  • 您尝试了哪些查询,发生了什么?目标表是如何定义的?
  • 每一行都需要是唯一可识别的(通常使用主键)。那么你可以做update table set a=x where k=y
  • 请给出函数定义和目前尝试过的代码。
  • 我确定这是我忽略的一些简单的事情。

标签: sql sql-server tsql


【解决方案1】:

这是我现在能想到的,试着告诉我。

DECLARE Tran_Cursor CURSOR FOR 
SELECT * FROM Transactions
OPEN Tran_Cursor
FETCH NEXT FROM Tran_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
     UPDATE Increments SET Increment = Increment+1 WHERE v7Tables = 'Transactions' AND Site = 'TESTSERVER'
     SET @BatchID = newid()
     SELECT @TransID = Increment FROM Increments WHERE v7Tables = 'Transactions' AND Site = 'TESTSERVER'

     UPDATE Transactions set trans = @BatchId, Trans_id = @TransID  WHERE CURRENT OF Tran_Cursor
     SET @IntFlag = @intFlag +1
FETCH NEXT FROM Tran_Cursor
END
CLOSE Tran_Cursor
DEALLOCATE Tran_Cursor  

如果您不想更新已经具有唯一 ID 的记录,则可以替换以下语句

DECLARE Tran_Cursor CURSOR FOR 
SELECT * FROM Transactions

以下

DECLARE Tran_Cursor CURSOR FOR 
SELECT * FROM Transactions WHERE Trans_id IS NOT NULL

【讨论】:

  • 谢谢!这是第一次完美地工作!感谢您花时间为我编写这段代码。 - 史蒂夫(芝加哥)
【解决方案2】:

希望您正在尝试更新事务表。在这种情况下,您在更新语句中缺少 where 子句,而且我还有一个问题,您可以在 where 子句中使用哪一列。?

UPDATE Transactions set trans = @BatchId, Trans_id = @TransID WHERE (IdentityColum) = Value.

【讨论】:

  • 我正在更新事务表。我不知道我可以在 where 子句中使用什么,因为我正在尝试使用唯一值更新字段。我在表中有 5 行。我希望代码转到第一行,更新它。转到下一行,更新该行直到它到达末尾。
  • 那么在这种情况下尝试使用光标。!你能把 Transactions 表结构发给我,我可以试着为你写(如果你不确定如何使用光标。)
  • 谢谢@Muthu。多年前,我在 Oracle 中使用过一次游标。表结构基本上是 Transaction(varchar(60), Transid(int), Value(numeric(10,4)), initials(varchar(10))。我在 value 和 initials 中已经有了值。我只需要添加Transaction 和 Transid 中​​的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2012-02-28
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多