我的xml看起来像ff:
<root>
<TemplateQuestion>
<Row rfqID="1" rftID="1" questionDesc="Question 1" responseType="1" rfqDisplayOrder="1" deletedBit="0" />
<Row rfqID="2" rftID="1" questionDesc="Question 2" responseType="2" rfqDisplayOrder="2" deletedBit="0" />
<Row rfqID="3" rftID="1" questionDesc="Question 3" responseType="3" rfqDisplayOrder="3" deletedBit="0" />
</TemplateQuestion>
</root>
现在我的目标是让rfqID拥有字母&#34; q&#34;在它之前。所以结果应该像ff:
<root>
<TemplateQuestion>
<Row rfqID="q1" rftID="1" questionDesc="Question 1" responseType="1" rfqDisplayOrder="1" deletedBit="0" />
<Row rfqID="q2" rftID="1" questionDesc="Question 2" responseType="2" rfqDisplayOrder="2" deletedBit="0" />
<Row rfqID="q3" rftID="1" questionDesc="Question 3" responseType="3" rfqDisplayOrder="3" deletedBit="0" />
</TemplateQuestion>
</root>
我通过这样做实现了这个目标:
declare @xml XML
set @xml = (select dbo.udfGetXMLVal(1))
declare @nodeCount int
declare @i int
declare @qid nvarchar(20)
set @i = 1
select @nodeCount = @xml.value('count(/root/TemplateQuestion/Row/@rfqID)','int')
while(@i <= @nodeCount)
begin
select @qid = x.value('@rfqID[1]', 'VARCHAR(20)')
from @xml.nodes('/root/TemplateQuestion/Row[position()=sql:variable("@i")]') e(x)
set @qid = 'q' + @qid
select @qid
Set @xml.modify('replace value of (/root/TemplateQuestion/Row/@rfqID)[1] with sql:variable("@qid")')
set @i = @i + 1
end
我遇到这条线的问题:
Set @xml.modify('replace value of (/root/TemplateQuestion/Row/@rfqID)[1] with sql:variable("@qid")')
如何将[1]替换为变量@i?当我尝试使用sql:variable时,我得到一些字符串文字错误。
非常感谢您提供的任何帮助。谢谢
答案 0 :(得分:3)
又快又脏: - )
SELECT CAST(REPLACE(CAST(@x AS VARCHAR(MAX)),' rftID="',' rftID="q') AS XML);
这是一个干净的方法:
DECLARE @x XML='<root>
<TemplateQuestion>
<Row rfqID="1" rftID="1" questionDesc="Question 1" responseType="1" rfqDisplayOrder="1" deletedBit="0" />
<Row rfqID="2" rftID="1" questionDesc="Question 2" responseType="2" rfqDisplayOrder="2" deletedBit="0" />
<Row rfqID="3" rftID="1" questionDesc="Question 3" responseType="3" rfqDisplayOrder="3" deletedBit="0" />
</TemplateQuestion>
</root>';
SELECT
(
SELECT 'q' + R.value('@rfqID','varchar(max)') AS [@rfqID]
,R.value('@rftID','int') AS [@rftID]
,R.value('@questionDesc','varchar(max)') AS [@questionDesc]
--other attributes similar
FROM @x.nodes('/root/TemplateQuestion/Row') AS A(R)
FOR XML PATH('Row'),ROOT('TemplateQuestion'),TYPE
)
FOR XML PATH('root');
答案 1 :(得分:3)
“我如何将
[1]
替换为变量@i
?当我尝试使用sql:variable
”时,我遇到了字符串文字的错误
你可以这样做(经过测试并在SQL Server 2008R2中运行):
Set @xml.modify('
replace value of ((/root/TemplateQuestion/Row/@rfqID)[sql:variable("@i")] )[1]
with sql:variable("@qid")
')