2012-11-02 51 views
1

我有以下SQL脚本。正如你可以看到我手动@listingid值设置为30653.遍历我的SQL Server数据库中的所有记录

但是这个脚本应该在@listingid被分配[listings].id列的值[listings]表中的所有记录执行。

DECLARE @profname nvarchar(150) 
DECLARE @furl nvarchar(250) 
DECLARE @city nvarchar(250) 
DECLARE @listingid int 

set @listingid=30653 
--select the top 1 professionname 
SELECT TOP 1 @profname=REPLACE(LOWER(pn.title),' ','-'),@furl=l.friendlyurl,@city=REPLACE(REPLACE(LOWER(l.city),'''',''),' ','-') FROM healthprof_professionnames hpn 
INNER JOIN professionname pn ON pn.id=hpn.professionnameid 
INNER JOIN listings l on l.id=hpn.healthprofid 
WHERE [email protected] ORDER BY pn.title 

--check if current friendlyurl already contains profession 
IF NOT CHARINDEX(@profname,@furl)>0 
    SET @furl = @furl + '-' + @profname 

IF NOT CHARINDEX(@city,@furl)>0 
SET @furl = @furl + '-' + @city 

SET @furl = @furl + '-3' 

UPDATE listings set [email protected] WHERE [email protected] 
+3

这是非常程序的思维,而不是套思考。创建一个选择来抓取您想要更改的所有记录,然后将其转换为更新。一个查询。这就是你通常需要的。 –

+0

您还可以将URL翻译回您正在查询的记录?然后你不必保持Listings表与专业表(etc)保持同步。 –

+0

@TimLehner:谢谢,你是否可以举一个例子说明如何做到这一点? – Flo

回答

2

您可以在结果集使用游标遍历的每一行:

declare cur cursor for 
select distinct id from listings 

declare @listingid int 
open cur 
fetch next from cur into @listingid 

while @@FETCH_STATUS = 0 
BEGIN 
    -- your code from above goes here 

    fetch next from cur into @listingid 
END 

话虽这么说,我同意上面添的评论。如果可能的话,重写它以在一个基于集合的操作中工作。我认为这会工作,但我没有测试它:

;WITH vars AS (
    SELECT id, profname, furl, city 
    FROM (
     SELECT l.id, 
      REPLACE(LOWER(pn.title),' ','-') as profname, 
      l.friendlyurl as furl, 
      REPLACE(REPLACE(LOWER(l.city),'''',''),' ','-') as city, 
      ROW_NUMBER() OVER (PARTITION BY l.id ORDER BY pn.title) as rnk 
     FROM healthprof_professionnames hpn 
     INNER JOIN professionname pn ON pn.id=hpn.professionnameid 
     INNER JOIN listings l on l.id=hpn.healthprofid 
    ) A 
    WHERE A.rnk = 1 
), 
vars2 AS (
    SELECT id, 
     CASE WHEN NOT CHARINDEX(profname, furl) > 0 
      THEN furl + '-' + profname ELSE furl END as furl, 
     city 
    FROM vars 
), 
vars3 as (
    SELECT id, 
     CASE WHEN NOT CHARINDEX(city, furl) > 0 
      THEN furl + '-' + city ELSE furl END as furl 
    FROM vars2 
) 
UPDATE listings SET friendlyurl = vars3.furl + '-3' 
FROM listings INNER JOIN vars3 on vars3.id = listings.id