3

关于字符串验证的快速问题。

我们正在实现一个存储过程,其中包含许多过滤其结果的参数输入。它主要用于 SSRS 报告。

我们已经设置 proc 以便用户可以输入单个值或 sql 格式的列表(例如 'a'、'b'、...),但我们识别列表的方法非常初级。这个 -

if patindex('%''%'',%',) <> 0 

即,我们正在检查是否存在 eg 的单个实例 'item',
我们想要检查列表的格式是否正确 - 即列表由一系列以 'item', 块结尾的 'item' 块组成,并且之间没有杂散的逗号,偶数个撇号等。如果不是,我们想向非技术用户报告,而不是给他们一个难以理解的错误。

在 TSQL 中执行此操作有什么建议吗?或者这是 SSRS 更适合做的事情?(我承认我对 SSRS 几乎是全新的。)

4

1 回答 1

2

我建议在 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
于 2013-02-22T18:59:33.923 回答