2011-12-20 85 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