简体   繁体   中英

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

My Table Schema is as follows:

Gender: char(1), not null Last Name: varchar(25), null First Name: varhcar(35), not null

The data in the table looks like:

 Gender | Last Name | First Name |

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

I now am trying to update all the names in the table from the names present in the txt file.

My Query is as follows:

-- 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

What Happens is all the rows in the table are updated with the same values and each time i execute the query they are updated with the new set of values.

What I want is to loop through each row and update it and den update the next row with the other set of random name. But here it is updating the same random name across all the rows of the table.

Any help would be appreciated.

Each SELECT statement is only being executed once in your example (and thus returning 1 result), and since your UPDATE isn't being limited, you're applying the same value to every row.

If you want to update each row with different values, you can use a CTE and the ROW_NUMBER() function to update rows at a time.

There's no need to loop, you can do it in one fell swoop:

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

Demo: SQL Fiddle

This example is just for the FirstName.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM