2011-07-01 2 views
2

カーソルがあるストアドプロシージャで呼び出す関数「分割」があります。ストアドプロシージャのカーソルで関数を呼び出す

マイ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), ',') 
    
    • 29行に先頭のスペースを削除するために、あなたのdbo.split()を変更:あなたのキャンベルありがとう:(先頭のスペースああ
    set @String = LTRIM(right(@String,len(@String) - @idx)) 
    
+0

を、それが働きました。ありがとうございますありがとうありがとうありがとうありがとうありがとうありがとうありがとう – Harish

関連する問題