3

文字列の検証に関する簡単な質問。

結果をフィルタリングする多数のパラメータ入力を使用して、ストアドプロシージャを実装しています。これは主にSSRSレポートの背後にあります。

ユーザーが単一の値またはSQL形式のリスト(「a」、「b」など)を入力できるようにプロシージャを設定しましたが、リストを認識する方法は非常に基本的です。これ -

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

つまり、たとえばの単一のインスタンスがあるかどうかをチェックしています。たとえば、 '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 に答える