2017-01-23 81 views
0

我使用SQL的sp_xml_preparedocument功能将XML字符串转换成一个临时表所示:默认ID

create table #ExportTemplate 
(
     ExportTemplateId  uniqueidentifier not null default newid() 
    , ExportTypeId   uniqueidentifier not null 
    , TemplateDesc   varchar(100) not null 
    , Active    bit not null 
    , DateAdded    datetime not null 
    , DateModified   datetime not null 
) 

-- If Data is coming in by XML then merge changes into the table 
if len(isnull(@XMLString,'')) > 0 
begin 
    print '*** Merging XML Changes' 

    declare  @XMLTable xml 
       , @idoc int 
       , @Cnt int 

    --Load XML 
    begin 
     set @XMLTable = @XmlString; --Convert string to xml 

     exec sp_xml_preparedocument @idoc OUTPUT, @XMLTable  

     -- insert into #ExportTemplate 
     select 
       isnull(cast(et.ExportTemplateId as uniqueidentifier), newid()) as ExportTemplateId, 
       cast(et.ExportTypeId as uniqueidentifier) as ExportTypeId, 
       et.TemplateDesc, 
       et.Active, 
       getdate() as DateAdded, 
       getdate() as DateModified 
     from openxml(@idoc,'/ArrayOfTemplate/Template', 2) 
     with (
      ExportTemplateId uniqueidentifier 'ExportTemplateId', 
      ExportTypeId  uniqueidentifier 'ExportTypeId', 
      TemplateDesc  varchar(100)  'TemplateDesc', 
      Active    bit     'Active' 
     ) et 


     set @Cnt = @@rowcount; 
     print '*** ' + convert(varchar,@Cnt) + ' rows were retrieved from the XML Table'; 

     exec sp_xml_removedocument @idoc 
    end 

    select * from #ExportTemplate 
end 

,我通过这个功能的XML看起来是这样的:

<ArrayOfTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Template> 
     <ExportTemplateId>7f0db0ed-d215-4a25-a38a-0305dddc56b3</ExportTemplateId> 
     <ExportTypeId>408b6a56-3b7c-41d8-902a-a20f5b2df170</ExportTypeId> 
     <TemplateDesc>Census Standard HR</TemplateDesc> 
     <Active>false</Active> 
     <DataElements /> 
    </Template> 
    <Template> 
     <ExportTemplateId>13691df1-9b4c-4b94-b106-41494fe172aa</ExportTemplateId> 
     <ExportTypeId>94fb5330-9bd8-4622-8c26-dd212832b20c</ExportTypeId> 
     <TemplateDesc>Census Standard Payroll</TemplateDesc> 
     <Active>true</Active> 
     <DataElements /> 
    </Template> 
    <Template> 
     <ExportTemplateId></ExportTemplateId> 
     <ExportTypeId>94fb5330-9bd8-4622-8c26-dd212832b20c</ExportTypeId> 
     <TemplateDesc>Census Standard Payroll New</TemplateDesc> 
     <Active>true</Active> 
     <DataElements /> 
    </Template> 
</ArrayOfTemplate> 

如果我创建一个新的Template(XML示例中的最后一个模板条目),我希望合并功能自动分配newid()。我怎样才能做到这一点?目前,我有什么抛出的'Conversion failed when converting from a character string to uniqueidentifier.'

+0

我从你的代码中假设这是SQL Server?请使用正确的RDBMS包括编辑您的问题和标签。版!你说的是'MERGE',但我看不到任何东西要合并......是这样吗,已经有'#ExportTable'中的数据了,你必须合并(更新/插入)与XML中的数据?是只有一个XML还是一次有很多XML?当然,这可以做得更好('FROM OPENXML'已过时),但我不完全明白你需要什么... – Shnugo

+0

这个问题解决了吗?你需要进一步的帮助吗?请允许我提示一个提示:如果这个问题已经解决,那么在(最佳)答案的投票柜台下面勾选验收检查将会非常友善。这将1)标记此问题已解决2)使追随者更容易找到最佳解决方案3)支付点给答复者和4)支付点给你。既然你已经跨越了15分的边界,你还需要额外的投票。这是SO的方式来说声谢谢。快乐编码! – Shnugo

回答

0

一个错误在我的评论,FROM OPENXML与相关的存储过程告诉准备和删除文件已经过时,不应该使用更多的(除了极少数例外存在)。以下向您展示如何使用现代XML方法从XML读取数据。

我的魔法水晶球告诉我,你可能需要像这样:

DECLARE @xml XML= 
N'<ArrayOfTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Template> 
     <ExportTemplateId>7f0db0ed-d215-4a25-a38a-0305dddc56b3</ExportTemplateId> 
     <ExportTypeId>408b6a56-3b7c-41d8-902a-a20f5b2df170</ExportTypeId> 
     <TemplateDesc>Census Standard HR</TemplateDesc> 
     <Active>false</Active> 
     <DataElements /> 
    </Template> 
    <Template> 
     <ExportTemplateId>13691df1-9b4c-4b94-b106-41494fe172aa</ExportTemplateId> 
     <ExportTypeId>94fb5330-9bd8-4622-8c26-dd212832b20c</ExportTypeId> 
     <TemplateDesc>Census Standard Payroll</TemplateDesc> 
     <Active>true</Active> 
     <DataElements /> 
    </Template> 
    <Template> 
     <ExportTemplateId></ExportTemplateId> 
     <ExportTypeId>94fb5330-9bd8-4622-8c26-dd212832b20c</ExportTypeId> 
     <TemplateDesc>Census Standard Payroll New</TemplateDesc> 
     <Active>true</Active> 
     <DataElements /> 
    </Template> 
</ArrayOfTemplate>'; 

查询检查/text(),这是NULL,如果没有内容,否则,你会得到一个空字符串,这对于一个GUID是不可搜索的。认识到这一点,我们可以在一个NULL - 值的情况下使用ISNULL并返回NEWID()

SELECT ISNULL(tmpl.value(N'(ExportTemplateId/text())[1]',N'uniqueidentifier'),NEWID()) AS ExportTemplateId 
     ,tmpl.value(N'(ExportTypeId/text())[1]',N'uniqueidentifier') AS ExportTypeId 
     ,tmpl.value(N'(TemplateDesc/text())[1]',N'nvarchar(max)') AS TemplateDesc 
     ,tmpl.value(N'(Active/text())[1]',N'bit') AS Active 
     --DataElements??? 
FROM @xml.nodes(N'/ArrayOfTemplate/Template') AS A(tmpl) 

您可能需要阅读one of my previous answers有关空元素和空值的差异。