簡體   English   中英

迭代更新表中的特定列(執行批量更新)

[英]Update specific columns in a table iteratively (Do a bulk update)

我的表架構如下:

性別:char(1),not null姓:varchar(25),null名字:varhcar(35),not null

表中的數據如下所示:

 Gender | Last Name | First Name |

   M       Doe         John
   F       Marie       Jane
   M       Jones       Jameson
   F       Simpson     Alice

我現在正在嘗試從txt文件中的名稱更新表中的所有名稱。

我的查詢如下:

-- Sort out the Forenames we'll be using for the data, we make a #Name2 table because I have yet to figure our
-- inserting specific columns using BULK INSERT and without using a format file.
CREATE TABLE #Name (Name VARCHAR(50))
CREATE TABLE #ForeNames (FirstName VARCHAR(50), Gender VARCHAR(1))
-- Move data in the #Name2 table
BULK INSERT #Name FROM "c:\girlsforenames.txt" WITH (ROWTERMINATOR='\n')
-- Now move it to the forename table and add the gender
INSERT INTO #ForeNames SELECT [Name], 'F' FROM #Name
-- Delete the names from temporary table
TRUNCATE TABLE #Name
-- Same for the boys
BULK INSERT #Name FROM "c:\boysforenames.txt" WITH (ROWTERMINATOR='\n')
INSERT INTO #ForeNames SELECT [Name], 'M' FROM #Name
-- Now do the surnames
TRUNCATE TABLE #Name
BULK INSERT #Name FROM "c:\surnames.txt" WITH (ROWTERMINATOR='\n')


DECLARE @Counter BIGINT
SET @Counter = 4
WHILE (@Counter > 0)
BEGIN
 UPDATE TableName 
 set
 [last_name]= (SELECT TOP 1 FirstName from #ForeNames),
 [first_name]=(SELECT TOP 1 Name FROM #Name ORDER BY NEWID()),
 [gender]= ( SELECT TOP 1 Gender FROM #ForeNames ORDER BY NEWID());
 SET @Counter=@Counter-1
END

DROP TABLE #Name
DROP TABLE #ForeNames

SELECT * FROM TableName

發生的情況是表中的所有行都使用相同的值進行更新,每次執行查詢時,都會使用新的值集更新它們。

我想要的是遍歷每一行並更新它,並使用另一組隨機名稱更新下一行。 但是這里它在表的所有行中更新相同的隨機名稱。

任何幫助,將不勝感激。

每個SELECT語句僅在您的示例中執行一次(因此返回1個結果),並且由於您的UPDATE不受限制,因此您將相同的值應用於每一行。

如果要使用不同的值更新每一行,可以使用CTE和ROW_NUMBER()函數一次更新行。

沒有必要循環,你可以一舉做到:

WITH cte AS (SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS n1
             FROM TableName
            )
UPDATE cte 
SET FirstName = names.Name
FROM cte 
JOIN (SELECT *,ROW_NUMBER() OVER (ORDER BY NEWID()) AS n2
      FROM #name
      )names
    on cte.n1 = names.n2

演示: SQL小提琴

此示例僅適用於FirstName。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM