[英]Calling a Function in a Stored Proc Cursors
我有一个 function “Split”,我正在使用 cursor 在存储过程中调用它。
我的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
function 拆分:
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
,我期望 output 为“ False
”,但我总是得到“ True
”。 我尝试调试,发现“ if exists (select * from c_file_extensions where description = @allowed_file_extensions and is_enabled = 0)
”无法正常工作。
发生这种情况是因为您正在与带有前导空格的项目进行比较。
尝试这个:
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.