2014-03-25 24 views
0

我試圖通過SQL存儲過程循環訪問電子郵件地址列表 - 獲取電子郵件地址的第一部分並查詢另一個表其中部分相匹配AA字段如何使用SQL SEVER存儲過程遍歷字符串列表並更新表

DECLARE @channelName char(100) 
DECLARE @EmailAddress char(100) 
DECLARE @ParsedEmailID char(100) 

DECLARE gpluscursor CURSOR for Select email from Accounts 
OPEN gpluscursor 
Fetch NEXT from gpluscursor 
into @EmailAddress 
While @@Fetch_Status=0 
Begin 
While @EmailAddress is not NULL 
    Begin 
    PRINT @EmailAddress 
    set @ParsedEmailID = (SELECT SUBSTRING(email,0,CHARINDEX('-',email)) from Accounts where email = @EmailAddress) 
    PRINT @ParsedEmailID 
    set @channelName = (SELECT channelname FROM channel where channelname like '%'[email protected]+'%') 
    PRINT 'mychannel'[email protected] 
    update Accounts set channel = @channelName where email like @EmailAddress 
    End 
Fetch Next from gpluscursor 
into @EmailAddress 
    PRINT @EmailAddress 
End 
close gpluscursor 

下面是從輸出的結果:

[email protected]               
test                      

[email protected]               
test                      

[email protected]               
test  

看來,光標不移動到下一個記錄。我在這裏做錯了什麼?

+1

這可以在不使用遊標的情況下實現,您是否有特定的理由使用遊標? – gh9

+0

我寧願不使用光標 – Milligran

回答

0
SELECT channelName,SUBSTRING(email,0,CHARINDEX('-',email)) 
from Accounts as A 
INNER JOIN channel AS c ON channelname like SUBSTRING(email,0,CHARINDEX('-',email)) 

不是最有效的,但它會讓你在那裏。如果我們能夠刪除類似的比較會更好,但如果這就是我們將使用的那樣。

0

就您的光標而言,將您的WHILE更改爲IF。你的代碼進入一個無限循環......

但正如其他人所說的,更優化的方法是不使用Cursor

DECLARE @channelName char(100) 
DECLARE @EmailAddress char(100) 
DECLARE @ParsedEmailID char(100) 

DECLARE gpluscursor CURSOR for Select email from Accounts 
OPEN gpluscursor 
Fetch NEXT from gpluscursor 
into @EmailAddress 
While @@Fetch_Status=0 
Begin 
IF (@EmailAddress is not NULL) 
    Begin 
    PRINT @EmailAddress 
    set @ParsedEmailID = (SELECT SUBSTRING(email,0,CHARINDEX('-',email)) from Accounts where email = @EmailAddress) 
    PRINT @ParsedEmailID 
    set @channelName = (SELECT channelname FROM channel where channelname like '%'[email protected]+'%') 
    PRINT 'mychannel'[email protected] 
    update Accounts set channel = @channelName where email like @EmailAddress 
    End 
Fetch Next from gpluscursor 
into @EmailAddress 
    PRINT @EmailAddress 
End 
close gpluscursor 
+0

有時候回答這個問題並不是正確的做法。在像這樣的情況下,如果你看到OP以某種錯誤的方式做事,有時候最好提出一個更好的方式來做這件事,而不是解決OP的問題。 – gh9

0

我覺得你的變量類型,焦炭,可能是部分你的問題。

運行以下命令:

DECLARE @ParsedEmailID char(100) 
SELECT @ParsedEmailID = 'test' 
PRINT '%' + @ParsedEmailID + '%' 

的輸出是什麼?這是(滾動到右邊看%的結尾):

%test                        % 

可能不是你想要的。 Switch char to varchar:

DECLARE @ParsedEmailID varchar(100) 
SELECT @ParsedEmailID = 'test' 
PRINT '%' + @ParsedEmailID + '%' 

現在,輸出是什麼?它是這樣的:

%test% 

我懷疑這就是你要做的。