验证SQL中的List输入

时间:2013-02-21 09:51:52

标签: sql-server tsql validation sql-server-2005

有关字符串验证的快速提问。

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

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

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

即我们正在检查是否存在例如'item',的单个实例 我们希望检查列表是否在此之外形成良好 - 即列表由一系列'item',块组成,以'item'块结尾,并且在偶数之间没有逗号逗号撇号等。如果不是,我们想向非技术人员报告,而不是给他们一个难以理解的错误。

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

1 个答案:

答案 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