出于某种原因,我觉得我正在以痛苦的方式解决这个问题。 我有一个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
有更干净的方法吗?
答案 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)方法