【问题标题】:Modify several xml attributes, based on a list修改几个xml属性,基于一个列表
【发布时间】:2011-07-08 01:42:25
【问题描述】:

来自之前的帖子: SQL Server XML add attribute if non-existent

我想做的是能够修改多个标签。下面是显示我想做但不能做的代码,因为我收到错误:XML 数据类型方法“exist”的参数 1 必须是字符串文字。使用变量而不是文字来修改 XML 的方法?

ALTER FUNCTION [dbo].[ConvertXmlData](@xmlData XML)
RETURNS XML
AS
BEGIN

    DECLARE @tags TABLE (
      ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
      TAG VARCHAR(25)
    )

    INSERT INTO @tags
    SELECT 'xxx' UNION   
    SELECT 'yyy'

    DECLARE @counter INT
    DECLARE @count   INT
    DECLARE @id      INT
    DECLARE @tag     VARCHAR(25)
    DECLARE @exist   VARCHAR(100)
    DECLARE @insert  VARCHAR(100)
    DECLARE @existX  VARCHAR(100)
    DECLARE @insertX VARCHAR(100)

    SET @exist   = 'descendant::{0}[not(@runat)]'
    SET @insert  = 'insert attribute runat { "server" } into descendant::{0}[not(@runat)][1]'
    SET @counter = 1
    SELECT @count = COUNT(*) FROM @tags

    WHILE @counter <= @count BEGIN

      SELECT @tag = TAG FROM @tags WHERE ID = @counter
      SET @existX = REPLACE(@existX,   '[0]', @tag)
      WHILE @xmlData.exist(@existX) = 1 BEGIN
        SET @xmlData.modify(REPLACE(@insertX, '[0]', @tag));
      END

      SET @counter = @counter + 1
    END    

  RETURN @xmlData
END

【问题讨论】:

    标签: sql xml


    【解决方案1】:

    您不能将变量用作 xml 函数的参数,但您可以在文字表达式中使用变量(和表列)。

    我想这就是你想要的。至少它应该让你知道你能做什么。

    declare @xmlData xml
    set @xmlData = 
    '<something>
       <xxx id="1"/>
       <xxx id="2" runat="server" />
       <xxx id="3"/>
       <yyy id="3" />
       <zzz id="1"/>
     </something>'
    
    declare @tags table
    (
      id int identity(1,1) primary key,
      tag varchar(25)
    )
    
    insert into @tags
    select 'xxx' union   
    select 'yyy'
    
    declare @tag varchar(25)
    declare @id int
    
    select top 1
           @id = id,
           @tag = tag
    from @tags
    order by id
    
    while @@rowcount > 0
    begin
      while @xmlData.exist('descendant::*[local-name() = sql:variable("@tag") and not(@runat)]') = 1 
      begin
        set @xmlData.modify('insert attribute runat { "server" } into descendant::*[local-name() = sql:variable("@tag") and not(@runat)][1]');
      end
    
      select top 1
           @id = id,
           @tag = tag
      from @tags
      where id > @id
      order by id
    end    
    
    select @xmlData
    

    结果:

    <something>
      <xxx id="1" runat="server" />
      <xxx id="2" runat="server" />
      <xxx id="3" runat="server" />
      <yyy id="3" runat="server" />
      <zzz id="1" />
    </something>
    

    【讨论】:

    • 太棒了!正是我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多