代码之家  ›  专栏  ›  技术社区  ›  Kenny Mann

是否可以将XML数据类型用作数据表?

  •  0
  • Kenny Mann  · 技术社区  · 15 年前

    出于某种原因,我觉得我要用痛苦的方式来做这件事。 我有一个插入XML列表。我使用XML是因为我需要传递多个动态值。因为我们正在保存事件,所以我已经有了这个ID。我不知道的是组或房间ID,所以我使用XML来传递数据表。

    以下是插入部分示例:

    IF @eventGroupTagRoomListInsert IS NOT NULL
        BEGIN
            INSERT INTO EventGroupTagRoomLink(EventID, RoomID, GroupTagID, IsDeleted, LastModifiedBy, SessionID)
                SELECT
                    @eventID AS EventID,
                    ParamValues.Id.query('RoomId').value('.', 'int') AS RoomID,
                    ParamValues.Id.query('GroupTagID').value('.', 'int') AS GroupTagID,
                    0 AS IsDeleted,
                    @lastModifiedBy  AS LastModifiedBy,
                    @sessionId AS SessionID
                FROM @eventGroupTagRoomListInsert.nodes('/Entities/entity') AS ParamValues(ID)
            IF @@ERROR <> 0 GOTO ERR_HANDLER
        END
    

    有更干净的方法吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Remus Rusanu    15 年前

    我同意,可以接受。

    理论上,在SQL 2008中 Table Valued Parameters 这可能更简单,至少作为语法:

    INSERT INTO EventGroupTagRoomLink
      (EventID, RoomID, GroupTagID, IsDeleted, LastModifiedBy, SessionID) 
    SELECT EventID, RoomID, GroupTagID, IsDeleted, LastModifiedBy, SessionID 
    FROM @eventGroupTagRoomTVP
    

    但是在向后兼容性问题(2005年不起作用)和不友好的方式之间 TVP to ADO.Net (必须是DataTable或DBDataReader,将不接受例如LINQ查询表达式)我不确定是否要通过XML移动到TVP。

        2
  •  2
  •   gbn    15 年前

    这种方法没有问题。

    我在一些地方使用它是因为它是处理数组和列表的有效方法(特别是在SQL Server 2005+中)

    Erland and his famous "Arrays and Lists" article

    如果您也阅读了它和测试,那么XML是 通常 最快的“独立”(不需要clr)方法