2013-04-25 90 views
-1

我在我的環境中使用SQL Server 2005。使用T-SQL進行復雜搜索/篩選列中的文本

我有一列,其中每行包含了一些關於一些SQL查詢的數據。每行看起來像數據庫中的一個長行,但是當您從行中提取數據時,它會被拆分爲多行,因爲它包含回車符。

下面是由回車分開的一列中的數據的一個示例。我試圖找出一種方法,到目前爲止還沒有成功,在這種方式中,我可以提取每行包含「pseudo =」的等號後的所有內容,除了前導空格和尾部空格。

因此,在包含「僞=」的行上,我希望在=符號後出現的所有內容。然後,我想修剪前後空格,如果有的話。我也希望在每個「僞=」行結束時保持回車。然後,我想將所有「僞=」行的新字符串存儲到新列中的新行中。

我的SQL不是很強大,這個小小的謎題已經引發了我的循環。任何幫助是極大的讚賞。請注意,列最多有500到600行,但如果這對任何事情都很重要,那裏會有一堆文字。

0x8A40D34D4BEC294D8934029D569B2BFE 
table=ca_discovered_hardware 
target_type=1 
label=label 
typefield= 
primarykeyfield=dis_hw_uuid 
secondarykeyfield=domain_uuid 
excludeclause= 
[Arguments] 
Arguments=12 
[Argument 1] 
type=1 
pseudo= ( 
sql=(
valid=1 
[Argument 2] 
type=11 
pseudo=(Link Query '[ES] IPQ: Tokyo (JPN)' using 'default' method) 
sql=dis_hw_uuid in ($TARGETLINKSQL$) 
valid=1 
queryuuid=f8e488a2b34ee24b85db3f8fafd4e9a2 
query_name=[ES] IPQ: S&B - Tokyo (JPN) 
[Argument 3] 
type=1 
pseudo=) 
sql=) 
valid=1 
[Argument 4] 
type=1 
pseudo= AND 
sql= AND 
valid=1 
[Argument 5] 
type=1 
pseudo= NOT 
sql= NOT 
valid=1 
[Argument 6] 
type=1 
pseudo= ( 
sql=(
valid=1 
[Argument 7] 
type=9 
pseudo=(Current Server = 'APTOPRK01CIGE') 
sql=ca_discovered_hardware.dis_hw_uuid in (SELECT object_uuid FROM ca_agent WHERE server_uuid IN (SELECT server_uuid FROM ca_server WHERE label='APTOPRK01CIGE')) 
valid=1 
[Argument 8] 
type=1 
pseudo= OR 
sql= OR 
valid=1 
[Argument 9] 
type=11 
pseudo=(Link Query '[DM] EXQ: Obsolete Exclude' using 'default' method) 
sql=dis_hw_uuid in ($TARGETLINKSQL$) 
valid=1 
queryuuid=00000000000000000000000000000000 
query_name=[DM] EXQ: Obsolete Exclude 
[Argument 10] 
type=1 
pseudo= OR 
sql= OR 
valid=1 
[Argument 11] 
type=11 
pseudo=(Link Query '[DM] EXQ: Server Exclude' using 'default' method) 
sql=dis_hw_uuid in ($TARGETLINKSQL$) 
valid=1 
queryuuid=00000000000000000000000000000000 
query_name=[DM] EXQ: Server Exclude 
[Argument 12] 
type=1 
pseudo=) 
sql=) 
valid=1 

回答

1

試試看看這個代碼。

用戶自定義函數iter_charlist_to_tbl將字符串拆分爲具有已定義的分隔符的行。 (從here截取)

串的my_convert功能串連行字符串

SQL Fiddle

MS SQL Server 2008的架構設置

create table t (str varchar(max)) 
go 

create function my_convert(@str varchar(max)) 
returns varchar(max) 
as 
begin 
    declare @p_str varchar(max), @result varchar(max), @delim varchar(2) 
    set @delim = char(10) 
    set @result = '' 

    declare CUR cursor for 
    select right(str, len(str) -7) as result--, str 
    from dbo.iter_charlist_to_tbl(@str, @delim) t 
    where str like 'pseudo=%' 
    open CUR 
    fetch next from CUR into @p_str 
    while @@fetch_status = 0 
    begin 
    set @result = @result + @p_str + char(10) 
    fetch next from CUR into @p_str 
    end 
    close CUR 
    deallocate CUR 
    return @result 
end 
go 


CREATE FUNCTION iter_charlist_to_tbl 
       (@list  nvarchar(MAX), 
        @delimiter nvarchar(2) = N',') 
     RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL, 
          str  varchar(4000)  NOT NULL, 
          nstr nvarchar(2000)  NOT NULL) AS 

BEGIN 
    DECLARE @endpos int, 
      @startpos int, 
      @textpos int, 
      @chunklen smallint, 
      @tmpstr nvarchar(4000), 
      @leftover nvarchar(4000), 
      @tmpval nvarchar(4000) 

    SET @textpos = 1 
    SET @leftover = '' 
    WHILE @textpos <= datalength(@list)/2 
    BEGIN 
     SET @chunklen = 4000 - datalength(@leftover)/2 
     SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen) 
     SET @textpos = @textpos + @chunklen 

     SET @startpos = 0 
     SET @endpos = charindex(@delimiter COLLATE Slovenian_BIN2, @tmpstr) 

     WHILE @endpos > 0 
     BEGIN 
     SET @tmpval = ltrim(rtrim(substring(@tmpstr, @startpos + 1, 
              @endpos - @startpos - 1))) 
     INSERT @tbl (str, nstr) VALUES(@tmpval, @tmpval) 
     SET @startpos = @endpos 
     SET @endpos = charindex(@delimiter COLLATE Slovenian_BIN2, 
           @tmpstr, @startpos + 1) 
     END 

     SET @leftover = right(@tmpstr, datalength(@tmpstr)/2 - @startpos) 
    END 

    INSERT @tbl(str, nstr) VALUES (ltrim(rtrim(@leftover)), ltrim(rtrim(@leftover))) 
    RETURN 
END 
go 

insert t (str) values (
    '0x8A40D34D4BEC294D8934029D569B2BFE 
table=ca_discovered_hardware 
target_type=1 
label=label 
typefield= 
primarykeyfield=dis_hw_uuid 
secondarykeyfield=domain_uuid 
excludeclause= 
[Arguments] 
Arguments=12 
[Argument 1] 
type=1 
pseudo= ( 
sql=(
valid=1 
[Argument 2] 
type=11 
pseudo=(Link Query ''[ES] IPQ: Tokyo (JPN)'' using ''default'' method) 
sql=dis_hw_uuid in ($TARGETLINKSQL$) 
valid=1 
queryuuid=f8e488a2b34ee24b85db3f8fafd4e9a2 
query_name=[ES] IPQ: S&B - Tokyo (JPN) 
[Argument 3] 
type=1 
pseudo=) 
sql=) 
valid=1 
[Argument 4] 
type=1 
pseudo= AND 
sql= AND 
valid=1 
[Argument 5] 
type=1 
pseudo= NOT 
sql= NOT 
valid=1 
[Argument 6] 
type=1 
pseudo= ( 
sql=(
valid=1 
[Argument 7] 
type=9 
pseudo=(Current Server = ''APTOPRK01CIGE'') 
sql=ca_discovered_hardware.dis_hw_uuid in (SELECT object_uuid FROM ca_agent WHERE server_uuid IN (SELECT server_uuid FROM ca_server WHERE label=''APTOPRK01CIGE'')) 
valid=1 
[Argument 8] 
type=1 
pseudo= OR 
sql= OR 
valid=1 
[Argument 9] 
type=11 
pseudo=(Link Query ''[DM] EXQ: Obsolete Exclude'' using ''default'' method) 
sql=dis_hw_uuid in ($TARGETLINKSQL$) 
valid=1 
queryuuid=00000000000000000000000000000000 
query_name=[DM] EXQ: Obsolete Exclude 
[Argument 10] 
type=1 
pseudo= OR 
sql= OR 
valid=1 
[Argument 11] 
type=11 
pseudo=(Link Query ''[DM] EXQ: Server Exclude'' using ''default'' method) 
sql=dis_hw_uuid in ($TARGETLINKSQL$) 
valid=1 
queryuuid=00000000000000000000000000000000 
query_name=[DM] EXQ: Server Exclude 
[Argument 12] 
type=1 
pseudo=) 
sql=) 
valid=1 
    ') 

查詢1

-- table result 
declare @long varchar(max) 
declare @crlf varchar(2) = char(10) 
select @long = str from t 
select right(str, len(str) -7) as result--, str 
from dbo.iter_charlist_to_tbl(@long, @crlf) t 
where str like 'pseudo=%' 

/*--string result 
select dbo.my_convert(str) from t 
*/ 

Results

|               RESULT | 
-------------------------------------------------------------------- 
|                (| 
|  (Link Query '[ES] IPQ: Tokyo (JPN)' using 'default' method) | 
|                ) | 
|                AND | 
|                NOT | 
|                (| 
|        (Current Server = 'APTOPRK01CIGE') | 
|                OR | 
| (Link Query '[DM] EXQ: Obsolete Exclude' using 'default' method) | 
|                OR | 
| (Link Query '[DM] EXQ: Server Exclude' using 'default' method) | 
|                ) |