2011-07-01 25 views
2

我有一個函數「Split」,我正在使用遊標在存儲過程中調用該函數。調用存儲過程中的函數遊標

a_upload表結構是:(int, varchar(100))

upload_id allowed_file_extensions 
--------------------------------------------------------------------- 
1   .xls, .doc, .pdf, .docx, .xlsx, .pptx, .txt 
2   .xls, .doc, .pdf, .jpeg, .jpg, .docx, .xlsx, .pptx, .txt 

c_file_extensions是:(int, varchar(100), bit)

id description is_enabled 
--------------------------- 
1 .xls   1 
2 .doc   1 
3 .pdf   0 
4 .rtf   1 

存儲過程:

DECLARE @is_enabled Varchar(10), @allowed_file_extensions Varchar(100) 

    SET @is_enabled = 'True'; 

DECLARE cur CURSOR FORWARD_ONLY FOR 
    SELECT items 
    FROM split((SELECT allowed_file_extensions 
        FROM a_upload 
       WHERE upload_id = 1), ',') 

OPEN cur 
FETCH NEXT FROM cur INTO @allowed_file_extensions 
WHILE @@fetch_status=0 
BEGIN 

    IF EXISTS(SELECT * 
       FROM c_file_extensions 
       WHERE description = @allowed_file_extensions 
       AND is_enabled = 0) 
     SET @is_enabled = 'False'; 

FETCH NEXT FROM cur INTO @allowed_file_extensions 
END 
CLOSE cur 
DEALLOCATE cur 

SELECT @is_enabled AS Output 

功能分割:

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))  
    RETURNS @temptable TABLE (items varchar(8000)) AS 

BEGIN 
    DECLARE @idx int  
    DECLARE @slice varchar(8000)  

    SELECT @idx = 1  

    IF LEN(@String) < 1 OR @String IS NULL RETURN 

    WHILE @idx!= 0  
    BEGIN  
     SET @idx = CHARINDEX(@Delimiter,@String)  
     IF @idx != 0  
      SET @slice = LEFT(@String,@idx - 1)  
     ELSE  
      SET @slice = @String  

      IF(LEN(@slice)>0) 
      INSERT INTO @temptable 
      (Items) 
      VALUES 
      (@slice)  

      SET @String = RIGHT(@String, LEN(@String) - @idx)  
      IF LEN(@String) = 0 BREAK 
    END 
RETURN  
END 

對於upload_id = 1,我期待輸出爲'False',但我總是得到'True'。我試圖調試,發現「if exists (select * from c_file_extensions where description = @allowed_file_extensions and is_enabled = 0)」工作不正常。

回答

1

發生這種情況是因爲您正在比較具有前導空格的項目。

試試這個:

select items from split((select ext from a_upload where id = 1), ',') 

這導致:

.xls 
.doc 
.pdf 
.docx 
.xlsx 
.pptx 
.txt 

爲了解決這個問題,你可以:

  • 修改遊標定義:
select LTRIM(items) from split((select ext from a_upload where id = 1), ',') 
  • 修改dbo.split(),以消除線路29前導空格:
set @String = LTRIM(right(@String,len(@String) - @idx)) 
+0

啊前導空格:(謝謝坎貝爾,它的工作。謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝 – Harish