有关字符串验证的快速提问。
我们正在实现一个存储过程,其中包含许多参数输入,用于过滤其结果。它主要是支持SSRS报告。
我们设置了proc,以便用户可以输入单个值或sql格式的列表(例如'a','b',...),但我们识别列表的方法非常简陋。这个 -
if patindex('%''%'',%',) <> 0
即我们正在检查是否存在例如'item',
的单个实例
我们希望检查列表是否在此之外形成良好 - 即列表由一系列'item',
块组成,以'item'
块结尾,并且在偶数之间没有逗号逗号撇号等。如果不是,我们想向非技术人员报告,而不是给他们一个难以理解的错误。
在TSQL中执行此操作的任何建议? 或者这是SSRS更适合做的事情吗? (我承认我对SSRS几乎全新。)
答案 0 :(得分:1)
我建议在t-sql中使用字符串拆分功能将条目拆分为更易于管理的信息。然后,使用类似的东西:
if (select count(1)
from dbo.StringSplit('''item1'', ''item2'', ''item3''', ',')
where StringPart not like '''%''') > 0
...
这是我的个人字符串拆分功能,供您参考:
create function [dbo].[StringSplit] ( @p_String varchar(max), @p_Delimiter char(1) = ',' )
returns @ReturnTable table (
[Index] int identity(1, 1) not null,
[StringPart] varchar(4000) not null
) as
begin
declare @EndPosition int
declare @StartPosition int = 0;
declare @TextPosition int = 1;
declare @ChunkLength smallint
declare @TemporaryString varchar(4000) = '';
declare @LeftOverString varchar(4000) = '';
declare @TemporaryValue varchar(4000) = '';
while @TextPosition <= Len( @p_String )
begin
set @ChunkLength = 4000 - Len( @LeftOverString )
set @TemporaryString = @LeftOverString + SubString( @p_String, @TextPosition, @ChunkLength )
set @TextPosition = @TextPosition + @ChunkLength
set @EndPosition = CharIndex( @p_Delimiter, @TemporaryString )
while @EndPosition > 0
begin
insert @ReturnTable values ( LTrim( RTrim( SubString( @TemporaryString, @StartPosition + 1, @EndPosition - @StartPosition - 1 ) ) ) )
set @StartPosition = @EndPosition
set @EndPosition = CharIndex( @p_Delimiter, @TemporaryString, @StartPosition + 1 )
end
set @LeftOverString = Right( @TemporaryString, Len( @TemporaryString ) - @StartPosition )
end
insert @ReturnTable values ( LTrim( RTrim( @LeftOverString ) ) )
return
end