我正在尝试创建一个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>
,其中###表示任意数量的两个已知字符串之间的字符和。问题是,我不知道这是否可能,或者如果它是如何做到的。
任何建议都是适当的。
答案 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