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)
"が正しく動作していないことがわかりました。
を、それが働きました。ありがとうございますありがとうありがとうありがとうありがとうありがとうありがとうありがとう – Harish