0

私のテーブルスキーマは次のとおりです。

性別: char(1)、null 以外 姓: varchar(25)、null 名: varhcar(35)、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

テーブル内のすべての行が同じ値で更新され、クエリを実行するたびに新しい値のセットで更新されます。

私が望むのは、各行をループして更新し、次の行を別のランダムな名前のセットで更新することです。ただし、ここでは、テーブルのすべての行で同じランダムな名前を更新しています。

どんな助けでも大歓迎です。

4

1 に答える 1

2

あなたの例では、各SELECTステートメントは 1 回だけ実行されます (したがって、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 のみを対象としています。

于 2013-07-08T17:45:28.687 に答える