2013-02-21 59 views
2

有關字符串驗證的快速問題。在SQL中驗證列表輸入

我們正在實現一個存儲過程,其中包含多個參數輸入來過濾其結果。它主要是放在SSRS報告後面。

我們已經設置了處理程序,以便用戶可以輸入單個值或sql格式的列表(例如'a','b',...),但我們用於識別列表的方法相當簡單。這 -

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

即我們正在檢查是否有例如'item',
的一個實例,我們想檢查名單以及形成超出了 - 即該列表是由一系列的'item',的塊與'item'塊完成,並沒有之間的流浪逗號,偶數的撇號等。如果不是,我們想報告給非技術用戶,而不是給他們一個難以估量的錯誤。

有關在TSQL中執行此操作的任何建議? 或者SSRS更適合做什麼? (我承認我幾乎是全新的SSRS。)

回答

1

我會建議在t-sql中使用字符串拆分功能將條目拆分爲更易於管理的信息。然後,使用類似:

if (select count(1) 
     from dbo.StringSplit('''item1'', ''item2'', ''item3''', ',') 
    where StringPart not like '''%''') > 0 
... 

這裏是我的personnal字符串分割功能,供大家參考:

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 
+0

對不起,我花了一段時間來回答。非常感謝 - 這是一個很好的方法,非常感謝您的幫助。 – DanBennett 2013-02-26 15:10:36