Вызов функции в хранимых курсорах Proc - PullRequest
2 голосов
/ 01 июля 2011

У меня есть функция "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 Ответ

1 голос
/ 01 июля 2011

Это происходит потому, что вы сравниваете элементы с пробелами.

Попробуйте это:

  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))  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...