2013-07-08 2 views
0

Моя таблица Схема выглядит следующим образом:обновления определенных столбцов в таблице итеративно (Do насыпной обновление)

Пол: голец (1), а не нулевой Фамилия: VARCHAR (25), нулевой Имя: varhcar (35), не нулевые

данные в таблице выглядит следующим образом:

Gender | Last Name | First Name | 

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

Сейчас я пытаюсь обновить все имена в таблице из имен, присутствующих в текстовом файле.

Мой запрос выглядит следующим образом:

-- 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 @[email protected] 
END 

DROP TABLE #Name 
DROP TABLE #ForeNames 

SELECT * FROM TableName 

Что происходит это все строки в таблице обновляются с теми же значениями, и каждый раз, когда я выполнить запрос они обновленные с новым набором значений.

То, что я хочу, это прокрутить каждую строку и обновить ее, а затем обновить следующую строку другим набором случайных имен. Но здесь он обновляет одно и то же случайное имя во всех строках таблицы.

Любая помощь будет оценена по достоинству.

+1

Пожалуйста, объясните, как коррелируются записи в файлах, например, как найти фамилию для данного имени для имени – alzaimar

+0

@alzaimar. Записи не коррелированы. Все, что мне нужно, это случайный набор имен для обновления. – user2471553

+0

@ user2471553 обновлено * what *? Откуда вы знаете, какие строки должны получать какие обновления? – RBarryYoung

ответ

2

Каждый оператор 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 Fiddle

Этот пример только для FirstName.

Смежные вопросы