3

我的 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 前面有字母“q”。所以结果应该像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 时,字符串文字出现一些错误。

您能提供的任何帮助将不胜感激。谢谢

4

2 回答 2

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")
')
于 2016-04-06T11:51:52.623 回答
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');   
于 2016-04-06T11:26:31.573 回答