2011-12-20 56 views
2

我試圖做一個sql腳本,它將隨機化「成員」表的城市,州和郵政編碼。我已經創建了一個表函數,它返回一個單行,其中隨機(通過視圖)從另一個數據庫中獲取列「city」,「state」和「zip」。這可以確保我得到一個真實世界中相互關聯的城市,州和郵政編碼。隨機化SQL數據與來自表函數的數據

從那裏我試圖做這樣的事情:

update t 
set 
t.City = citystate.city, 
t.State = citystate.state, 
t.PostalCode = citystate.zip 

from 
(select 
City, 
State, 
PostalCode from DATABASE.dbo.Member) t, 
DATABASE.dbo.getRandomCityState() citystate 

問題是,這只是叫我的函數一次,並提出同一個城市,州和郵編到表的每一行。有什麼方法可以爲表中的每一行調用我的函數一次?

+0

誰在地球上盲目地低估了體面的問題? (+1否定它。) – 2011-12-20 20:28:50

回答

1

確定,所以感謝我的同事之一,我們找到了解決辦法。看起來,由於函數沒有使用任何參數,SQL Server認爲結果永遠不會改變。所以我們欺騙了服務器,認爲每次將參數傳遞給不同的函數時都會有所不同:每行的id。由於我們每次都傳遞一個不同的參數,因此每行都會調用該函數。

update t 
set 
t.City = citystate.city, 
t.State = citystate.state, 
t.PostalCode = citystate.zip 

from 
(select top 10 
City, 
State, 
PostalCode from TrajectoryServicesTest.dbo.Member) t 
cross apply SanitizePhi.dbo.getRandomCityState(t.MemberID) citystate 

有點hacky,但它的工作。感謝Joe的幫助。

+0

關注Detirministic與非Detirministic函數。你想要一個非detirministic功能。在tsql中,通過包含一個函數調用CURRENT_TIMESTAMP或RAND之類的非特定函數,可以「強制」用戶定義的函數爲非特定的。 http://msdn.microsoft.com/en-us/library/ms178091.aspx – 2011-12-20 23:13:31

+0

這是一個好主意。請注意,您不能從標量函數調用RAND。我一整天都在處理這件事。我們最終使用的解決方案是將RAND調用放入視圖中。 – mtmurdock 2011-12-27 16:35:45

1

使用CROSS APPLY

update t 
set 
t.City = citystate.city, 
t.State = citystate.state, 
t.PostalCode = citystate.zip 

from 
(select 
City, 
State, 
PostalCode from DATABASE.dbo.Member) t 
CROSS APPLY 
DATABASE.dbo.getRandomCityState() citystate 
+0

沒有工作。我只是運行它,它將相同的值放入每一行。 – mtmurdock 2011-12-20 20:38:29