У меня есть функция "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)
" не работает должным образом.