2

我正在尝试将一堆字段从一个表移动到同一个表中包含的一个 xml blob。成功后,我将从表中删除该列。下面是我想出的一个非常简单的版本(没有 drop 列),这在 SQL 2008 上运行良好 - 但是我发现这在 SQL 2005 上不起作用。我得到了XQuery: SQL type 'datetime' is not supported in XQuery.错误由于字段的数量,实际上是通过在 SP 中执行构造的 SQL 语句来执行此操作的,但为简单起见,我在示例中使用了普通语句:

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

我试过用 with 包装sql:column("#Case.DecisionDate")xs:string(sql:column("#Case.DecisionDate"))但这似乎没有帮助。@marc_s 已经指出,直到 SQL 2008 才引入sql:column(在语句中的使用 - 所以我认为这是一个红鲱鱼。.modify(insert

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

4

1 回答 1

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 的输出,以在修改语句插入值中使用。

于 2011-10-12T15:31:48.237 回答