title: Obfuscate / Mask / Scramble personal information
body: <p>I'm looking for a homegrown way to scramble production data for use in development and test.  I've built a couple of scripts that make random social security numbers, shift birth dates, scramble emails, etc.  But I've come up against a wall trying to scramble customer names.  I want to keep real names so we can still use or searches so random letter generation is out.  What I have tried so far is building a temp table of all last names in the table then updating the customer table with a random selection from the temp table. Like this:</p>
  
  <pre><code>DECLARE @Names TABLE (Id int IDENTITY(1,1),[Name] varchar(100))
  
  /* Scramble the last names (randomly pick another last name) */
  INSERT @Names SELECT LastName FROM Customer ORDER BY NEWID();
  WITH [Customer ORDERED BY ROWID] AS
  (SELECT ROW_NUMBER() OVER (ORDER BY NEWID()) AS ROWID, LastName FROM Customer)
  UPDATE [Customer ORDERED BY ROWID] SET LastName=(SELECT [Name] FROM @Names WHERE ROWID=Id)
  </code></pre>
  
  <p>This worked well in test, but completely bogs down dealing with larger amounts of data (>20 minutes for 40K rows)</p>
  
  <p>All of that to ask, how would you scramble customer names while keeping real names and the weight of the production data?</p>
  
  <p><strong>UPDATE:</strong> Never fails, you try to put all the information in the post, and you forget something important. This data will also be used in our sales &amp; demo environments which are publicly available. Some of the answers are what I am attempting to do, to 'switch' the names, but my question is literally, how to code in T-SQL?</p>