使用XQuery修复SQL Update修改以使用SQL 2005

时间:2011-10-12 08:59:29

标签: sql-server-2005 xquery xquery-sql xml-dml xquery-update

我正在尝试将一堆字段从表中移动到同一个表中包含的xml blob中。在此成功后,我将从表中删除列。我提出的一个非常简单的版本(没有drop column)在下面,这在SQL 2008上工作正常 - 但是我发现这不适用于SQL 2005.我收到错误{{1我实际上是通过在SP中执行构造的SQL语句来实现这一点,因为字段的数量,但为了简单起见,我在示例中使用了一个普通语句:

XQuery: SQL type 'datetime' is not supported in XQuery.

我尝试用if OBJECT_ID('tempdb..#Case') is not null DROP Table #Case; CREATE TABLE #Case ( id INT, DecisionDate DateTime, CaseBlob xml ) INSERT INTO #Case Values(1, '10-OCT-2011 10:10:00', '<CaseBlob></CaseBlob>') INSERT INTO #Case Values(2, '20-OCT-2011 10:10:00', '<CaseBlob></CaseBlob>') INSERT INTO #Case Values(3, null, '<CaseBlob></CaseBlob>') INSERT INTO #Case Values(4, '21-OCT-2011 10:10:00', '<CaseBlob></CaseBlob>') INSERT INTO #Case Values(5, null, '<CaseBlob></CaseBlob>') UPDATE #Case SET CaseBlob.modify('insert <DecisionDate>{sql:column("#Case.DecisionDate")}</DecisionDate> as last into (/CaseBlob)[1]') WHERE #Case.DecisionDate is not null AND CaseBlob.exist('(/CaseBlob/DecisionDate)') = 0 SELECT * FROM #CASE 包裹sql:column("#Case.DecisionDate"),但这似乎没有帮助。 @marc_s已经指出在{2008}之前没有引入xs:string(sql:column("#Case.DecisionDate"))语句中sql:column(的使用 - 所以我认为这是一个红色的鲱鱼。

由于这是一个一次性的迁移脚本并且只需要运行一次,我认为我应该远离Set方法并转向程序循环方法以满足我的要求。由于服务器版本的限制以及我想要实现的目标,这听起来像是正确的方法吗?任何指针都非常感激。

1 个答案:

答案 0 :(得分:0)

第一部分:

您可以使用CTE使用日期时间样式126来查询转换为字符串的日期部分。

;with C as
(
  select CaseBlob,
         convert(varchar(23), DecisionDate, 126) as DecisionDate
  from #Case
  where DecisionDate is not null and
        CaseBlob.exist('(/CaseBlob/DecisionDate)') = 0
)
update C
set CaseBlob.modify('insert <DecisionDate>{sql:column("DecisionDate")}</DecisionDate>
                     as last into (/CaseBlob)[1]')

与更新语句相比,使用此输出存在微小差异。如果它们是.000,它将省略毫秒。如果它们实际上有一个值,它将被包含在内,因此您不会遗漏任何数据。它只是不同。

第二部分:

我真的不明白这与上面的连接如何能够给你一些示例代码。但是如果你需要从其他表中添加更多的东西,你可以加入CTE中的那些表,并将列作为CTE的输出,用于插入值的modify语句。