2

我正在尝试创建一个从字段中选择记录片段的 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,但在单个字段中可以有任意数量的带有提示和值的名称。我的下一个想法是使用替换来替换所有 <> 但这会让我留下像这样的东西

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>其中 ### 表示两个已知字符串之间的任意数量的字符和 . 问题是我不知道这是否可能,或者如果可能的话怎么做。

任何建议都可以接受。

4

3 回答 3

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%

于 2013-05-27T14:02:27.090 回答
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

这将导致:名称:Example1 类型:String Nullable:False AllowBlank:False Prompt:开始日期 (DD-MMM-YYYY) PromptUser:True
参数:
名称:Example2
类型:String
Nullable:False
AllowBlank:False Prompt:Case (Enter Case数字,% 代表全部,或 %AL% 代表阿尔伯塔省)
PromptUser : True
DefaultValues :
Value : %al%

值:
值:%al%

范围 :

于 2013-05-24T15:49:15.800 回答
0

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

尽管我更改了记事本++中的代码,但有一点警告,所以它可能有一个错误。这个想法是你把这段代码放在一个函数中,并将@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
于 2013-05-26T19:50:40.477 回答