Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich Zufallswerte in eine SQL Server-Tabelle einfügen?

Wenn die Abfragemaschine dies sieht...

(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())

... es ist alles wie "ooooh, eine zwischenspeicherbare skalare Unterabfrage, das werde ich zwischenspeichern!"

Sie müssen die Abfrage-Engine dazu bringen, zu glauben, dass sie nicht zwischengespeichert werden kann. jfars antworten war nah dran, aber die Abfrage-Engine war intelligent genug, um die Tautalogie von MyTable.MyColumn = MyTable.MyColumn zu sehen , aber es ist nicht schlau genug, das zu durchschauen.

UPDATE MyTable
   SET MyColumn = (SELECT TOP 1 val
                     FROM @randomStuff r
                          INNER JOIN MyTable _MT
                                  ON M.Id = _MT.Id
                    ORDER BY NEWID())
 FROM MyTable M

Durch Einbringen der äußeren Tabelle (MT) in die Unterabfrage geht die Abfrage-Engine davon aus, dass die Unterabfrage neu ausgewertet werden muss. Alles wird wirklich funktionieren, aber ich habe mich für den (angenommenen) Primärschlüssel von MyTable.Id entschieden, da er indiziert wäre und sehr wenig Overhead hinzufügen würde.

Ein Cursor wäre wahrscheinlich genauso schnell, macht aber sicher nicht so viel Spaß.