我尝试制作一个sql脚本,用于随机化“成员”表的城市,州和邮政编码。我已经创建了一个表函数,它返回一个单行,其中列“city”,“state”和“zip”随机从另一个数据库中获取(通过视图)。这可以确保我获得一个在现实世界中实际上彼此相关的城市,州和邮政编码。
从那里我试图做这样的事情:
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
问题是,这只调用我的函数一次,并将相同的city,state和zip放入表的每一行。有没有办法为表中的每一行调用一次函数?
答案 0 :(得分:1)
使用交叉申请
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
答案 1 :(得分: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的帮助。