【发布时间】:2014-02-04 17:36:46
【问题描述】:
我有一个函数,它在表中“针对每一行”进行迭代。当它运行时,它应该查看每一行,为该行提取相关的 SET 值并运行该函数,该函数依次返回结果并使用正确的值更新正确的行。正在发生的事情是它正在运行并返回最后一行的值并使用该值更新所有行。任何想法我做错了什么?
SELECT
RowNum = ROW_NUMBER() OVER(ORDER BY ID)
,*
INTO #Geo
FROM DDDG
DECLARE @MaxRownum INT
SET @MaxRownum = (SELECT MAX(RowNum) FROM #Geo)
DECLARE @Iter INT
SET @Iter = (SELECT MIN(RowNum) FROM #Geo)
WHILE @Iter <= @MaxRownum
BEGIN
SELECT *
FROM #Geo
WHERE RowNum = @Iter
DECLARE @address nvarchar (100);
Select @address = Ad1 from DDDG where id = @Iter;
DECLARE @state nvarchar (100);
SET @state = 'FL';
DECLARE @zip nvarchar (100);
SET @zip = '33142';
DECLARE @city nvarchar (100);
SET @city = 'Miami';
DECLARE @nation nvarchar (2);
SET @nation = 'us';
DECLARE @g geography;
WAITFOR DELAY '00:00:00.050'
SET @g = dbo.Geocode(@nation, @state, @city, @zip, @address);
Update DDDG
Set Lat = @g.Lat
where id = @Iter;
Update DDDG
Set long = @g.Long
where id = @Iter;
SET @Iter = @Iter + 1
END
DROP TABLE #Geo
更新.....
谢谢大家......我几乎让它工作了......经过大量的试验和错误后,我发现我需要更改以下内容
Update DDDG Set Lat = @g.Lat where id = id;
Update DDDG Set long = @g.Long where id = id;
我现在只有一个问题。当我删除行时,RowNum 和 @Iter 不再匹配。除了每次都重新创建表格之外,有没有办法解决这个问题?
【问题讨论】:
-
您应该重新编写逻辑以消除循环...SQL 是一种基于集合的语言,并且像这样执行得非常糟糕。当您放松线性思路时,它处理得更好,一个脚本来更新所有行,没有循环。
-
您确定地理编码功能不只是为每个地址返回相同的纬度和经度吗?
-
我敢肯定(威利博士的问题),至于更好的方法,我只做了 6 个月左右.. 如果你能告诉我一个更好的方法....我都是为它
标签: sql sql-server database tsql