 <p>As an additional idea, the problem of GarethD's method is, that it requires more or an equal number of rows in the second table as in the first table.</p> <p>So you can just do a cross join of the second table with the first one, and limit the results to the number of rows in the first table.</p> <pre><code>WITH PatientCTE AS ( SELECT PatientID ,pat_FirstName ,pat_LastName ,pat_StreetName ,pat_PostalCode ,pat_City ,pat_DateOfBirth ,rn = ROW_NUMBER() OVER(ORDER BY NEWID()) FROM Patients ) , SampleData AS ( SELECT TOP (SELECT COUNT(*) FROM PatientCTE ) GivenName ,SurName ,StreetAddress ,ZipCode ,City ,Birthday ,rn = ROW_NUMBER() OVER(ORDER BY NEWID()) FROM FakeNameGenerator CROSS JOIN PatientCTE ) UPDATE p SET p.pat_FirstName = fn.GivenName ,p.pat_LastName = fn.SurName ,p.pat_StreetName = fn.StreetAddress ,p.pat_PostalCode = fn.ZipCode ,p.pat_City = fn.City ,p.pat_DateOfBirth = fn.BirthDay FROM PatientCTE AS p INNER JOIN SampleData AS fn ON fn.rn = p.rn </code></pre>