2012-11-02 55 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