使用XML数据类型作为DataTable可以接受吗?

时间:2010-01-05 21:04:36

标签: tsql sql-server-2008

出于某种原因,我觉得我正在以痛苦的方式解决这个问题。 我有一个INSERT xml列表。我正在使用XML,因为我需要传递多个动态值。由于我们正在保存活动,因此我已经拥有该ID。我不知道的是Group或Room ID,所以我使用XML来传递数据表。

以下是INSERT部分的示例:

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 个答案:

答案 0 :(得分:2)

我会说是的,是可以接受的。

理论上,在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的相当不友好的方式之间(必须是数据表或DbDataReader,不接受例如linq查询表达式)我不是我肯定会转向使用XML的TVP。

答案 1 :(得分:2)

这种方法没有问题。

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

Erland and his famous "Arrays and Lists" article

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