从字段中选择多个子字符串

时间:2013-05-24 11:50:06

标签: sql replace sql-server-2008-r2 substring case

我正在尝试创建一个SQL查询,从字段中选择记录的各个部分。以下是一个未经编辑的字段中的缩短示例:

<Name>Example1</Name>
<Type>String</Type>
<Nullable>False</Nullable>
<AllowBlank>False</AllowBlank>
<Prompt>Start Date (DD-MMM-YYYY)</Prompt> 
<PromptUser>True</PromptUser>    </Parameter>    
<Parameter> 
<Name>Example2</Name>      
<Type>String</Type>      
<Nullable>False</Nullable>      
<AllowBlank>False</AllowBlank>
<Prompt>Case (Enter Case Number, % for all, OR %AL% for Alberta)</Prompt>      
<PromptUser>True</PromptUser>      
<DefaultValues>        
<Value>%al%</Value>      
</DefaultValues>      
<Values>        
<Value>%al%</Value>      
</Values>    </Parameter>    
<Parameter>

一个完全混乱的权利,我正在尝试取出所有的名字,提示,如果它有一个值,那么它的价值并将所有这些都放入一个字段中。例如,上面的字段应该如下所示

Name: Example1
Prompt: Start Date (DD-MMM-YYYY)
Name: Example2
Prompt: Case (Enter Case Number, % for all, OR %AL% for Alberta)
Value: %al%

我尝试过使用STUFF但是在单个字段中可以有任何带有提示和值的名称。我的下一个想法是使用替换来替换所有&lt;&gt;但是这会让我感觉像是这样的东西

Name: Example1
String
False
False
Prompt: Start Date (DD-MMM-YYYY)
Name: Example2     
String      
False     
False
Prompt: Case (Enter Case Number, % for all, OR %AL% for Alberta)    
True  
Value: %al% 
%al%

编辑:可能解决问题的另一个想法是,如果我可以使用REPLACE替换两个已知字符/字符串之间或与之一起的未知长度字符串,例如替换<Type>###</Type>,其中###表示任意数量的两个已知字符串之间的字符和。问题是,我不知道这是否可能,或者如果它是如何做到的。

任何建议都是适当的。

3 个答案:

答案 0 :(得分:1)

所以我检查了管理工作室的代码并发现了一些错误。

declare @var nvarchar(max)
declare @tag nvarchar(max)
declare @label nvarchar(max)
declare @start int
declare @stop int
declare @len int
declare @needed int

set @var = '<Name>Example1</Name>
<Type>String</Type>
<Nullable>False</Nullable>
<AllowBlank>False</AllowBlank>
<Prompt>Start Date (DD-MMM-YYYY)</Prompt> 
<PromptUser>True</PromptUser>        
<Parameter> </Parameter>
<Name>Example2</Name>      
<Type>String</Type>      
<Nullable>False</Nullable>      
<AllowBlank>False</AllowBlank>
<Prompt>Case (Enter Case Number, % for all, OR %AL% for Alberta)</Prompt>      
<PromptUser>True</PromptUser>      
<DefaultValues>        
<Value>%al%</Value>      
</DefaultValues>      
<Values>        
    <Value>%al%</Value>      
</Values>        
<Parameter></Parameter>'

set @needed = 0
set @start = charindex('<',@var)
set @stop = charindex('>',@var)
set @len = @stop - @start +1
set @tag = substring(@var,@start,@len)
set @label = substring(@var,@start+1,@len-2)
set @var =  replace(@var,@tag,@label + ' : ')

while(@start <> 0)
begin
    set @start = charindex('<',@var)
    set @stop = charindex('>',@var)
    set @len = @stop - @start +1
    if(@start <> 0)
    begin   
        set @tag = substring(@var,@start,@len)      
        if(charindex('/',@tag) = 0)
            begin
                set @label = substring(@var,@start+1,@len-2)+ ' : '     
                if(lower(@label) <> 'name : ' and lower(@label) <> 'value : ' and lower(@label) <> 'prompt : ')
                begin
                    set @needed = 0
                    set @var = replace(@var,@tag,'')
                    set @start = @stop - len(@tag)              
                    set @stop = charindex('<',@var)
                    set @len = @stop - @start
                    set @tag = substring(@var,@start,@len)                                      
                    set @var = replace(@var,@tag,'')
                end             
            end
        else
            begin
                set @label = ''
            end
        set @var = replace(@var,@tag,@label)
    end
end
print replace(@var,'
','')

这导致:     名称:例1     提示:开始日期(DD-MMM-YYYY)
    名称:例2     提示:案例(输入案例编号,%表示所有,或%AL%为艾伯塔省)值:
    %al%

答案 1 :(得分:0)

这就是我想出来的。我希望它有所帮助。基本上它会查找标签,如果它是一个结束标签,它会将其删除,如果它是一个开放标签,它将由标签变体替换。

declare @var nvarchar(max)
declare @tag nvarchar(max)
declare @label nvarchar(max)
declare @start int
declare @stop int
declare @len int

set @var = '<Name>Example1</Name>
<Type>String</Type>
<Nullable>False</Nullable>
<AllowBlank>False</AllowBlank>
<Prompt>Start Date (DD-MMM-YYYY)</Prompt> 
<PromptUser>True</PromptUser>        
<Parameter> </Parameter>
<Name>Example2</Name>      
<Type>String</Type>      
<Nullable>False</Nullable>      
<AllowBlank>False</AllowBlank>
<Prompt>Case (Enter Case Number, % for all, OR %AL% for Alberta)</Prompt>      
<PromptUser>True</PromptUser>      
<DefaultValues>        
<Value>%al%</Value>      
</DefaultValues>      
<Values>        
    <Value>%al%</Value>      
</Values>        
<Parameter></Parameter>'

set @start = charindex('<',@var)
set @stop = charindex('>',@var)
set @len = @stop - @start +1
set @tag = substring(@var,@start,@len)
set @label = substring(@var,@start+1,@len-2)
set @var =  replace(@var,@tag,@label + ' : ')

while(@start <> 0)
begin
set @start = charindex('<',@var)
set @stop = charindex('>',@var)
set @len = @stop - @start +1
    if(@start <> 0)
    begin
        set @tag = substring(@var,@start,@len)      
        if(charindex('/',@tag) = 0)
        begin
            set @label = substring(@var,@start+1,@len-2)+ ' : '
        end
        else
        begin
            set @label = ''
        end
        set @var = replace(@var,@tag,@label)
    end
end

print @var

这导致: 名称:例1 类型:字符串 可空:错误 AllowBlank:错误 提示:开始日期(DD-MMM-YYYY) PromptUser:真实 参数:
名称:例2 类型:字符串
可空:虚假 AllowBlank:错误 提示:案例(输入案例编号,所有人的百分比,或艾伯塔省的%AL%)
PromptUser:真实 DefaultValues:
值:%al%

值:
值:%al%

参数:

答案 2 :(得分:0)

我更改了代码,以便只保存名称,提示和值部分。

虽然我改变了notepad ++中的代码,但是它可能有一个错误。 我们的想法是将此代码放在函数中并将@var部分作为参数传递。

declare @var nvarchar(max)
declare @tag nvarchar(max)
declare @label nvarchar(max)
declare @start int
declare @stop int
declare @len int
declare @needed int

set @var = '<Name>Example1</Name>
<Type>String</Type>
<Nullable>False</Nullable>
<AllowBlank>False</AllowBlank>
<Prompt>Start Date (DD-MMM-YYYY)</Prompt> 
<PromptUser>True</PromptUser>        
<Parameter> </Parameter>
<Name>Example2</Name>      
<Type>String</Type>      
<Nullable>False</Nullable>      
<AllowBlank>False</AllowBlank>
<Prompt>Case (Enter Case Number, % for all, OR %AL% for Alberta)</Prompt>      
<PromptUser>True</PromptUser>      
<DefaultValues>        
<Value>%al%</Value>      
</DefaultValues>      
<Values>        
    <Value>%al%</Value>      
</Values>        
<Parameter></Parameter>'

set @start = charindex('<',@var)
set @stop = charindex('>',@var)
set @len = @stop - @start +1
set @tag = substring(@var,@start,@len)
set @label = substring(@var,@start+1,@len-2)
set @var =  replace(@var,@tag,@label + ' : ')

while(@start <> 0)
begin
    set @start = charindex('<',@var)
    set @stop = charindex('>',@var)
    set @len = @stop - @start +1
    if(@start <> 0)
    begin
        set @tag = substring(@var,@start,@len)      
        if(charindex('/',@tag) = 0)
        begin
            set @label = substring(@var,@start+1,@len-2)+ ' : '
            if(lower(@label) = 'name' or lower(@label) = 'value' or         lower(@label) = 'prompt')
            begin
                set @needed = 1
            end
            else
            begin
                set @needed = 0
            end
        end
        else
        begin
            set @label = ''
        end

        if(@needed = 1)
        begin
            set @var = replace(@var,@tag,@label)
            end
                else
                begin
                    set @var = replace(@var,@tag,'')
                    set @start = @stop
                    set @stop = charindex('<',@var)
                    set @tag = substring(@var,@start,@stop)
                set @var = replace(@var,@tag,'')
            end
        end
    end

    print @var