【问题标题】:Insert xml element contents(which is also xml tags) into column in SQL Server 2005将 xml 元素内容(也是 xml 标签)插入 SQL Server 2005 的列中
【发布时间】:2012-01-04 11:32:12
【问题描述】:

对于像下面这样的表架构

CREATE TABLE [dbo].[Employee](
    [EmployeeId] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Location] [nvarchar](50) NOT NULL,
    [Skills] [xml] NOT NULL,
    [Projects] [nvarchar](400) NULL,
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 

向表中插入数据时,我只想插入 <SkillSet> 的子标签,但似乎 <SkillSet> 连同它的子元素一起插入到 Skill xml 列中。

declare @doc NVARCHAR(MAX)

declare @idoc INT

select @doc = '<Request Type="InsertEmployee" CRUD="C">
    <Employee>
      <EmployeeId>1</EmployeeId>
      <Name>Deeptechtons</Name>
      <Location>USA</Location>
        <SkillSet>
        <Skill>C#</Skill>
        <Skill>SQL Server 2005</Skill>
        <Skill>ASP.net</Skill>
        </SkillSet>
      <Projects>
        <Project>LowBin</Project>
        <Project>Maskin</Project>
      </Projects>
    </Employee>
  </Request>'

exec sp_xml_preparedocument @idoc output,@doc

insert into Employee (
                        EmployeeId
                        ,[Name]
                        ,Location
                        ,Skills,
                        Projects
                     )
            SELECT      NEWID()
                        ,[Name]
                        ,Location
                        ,Skills
                        ,Projects
            FROM OPENXML(@idoc,'Request/Employee',2)
            WITH
                    (
                        [Name] NVARCHAR(50)
                        ,Location   NVARCHAR(50)
                        ,Skills XML 'SkillSet'
                        ,Projects NVARCHAR(400)
                    )

exec sp_xml_removedocument @idoc

问题

  • 如何只插入&lt;Skillset&gt; 的子元素而不是整个标签及其子元素。

  • 我预计Projects 也将被插入,但只插入第一个项目标签的Lowbin 内容。你能更正我的代码吗?

【问题讨论】:

    标签: sql-server sql-server-2005 xquery-sql


    【解决方案1】:

    由于您使用的是 SQL Server 2005,因此您可以使用 XML 数据类型并改为这样做。

    declare @doc xml
    
    select @doc = '<Request Type="InsertEmployee" CRUD="C">
        <Employee>
          <EmployeeId>1</EmployeeId>
          <Name>Deeptechtons</Name>
          <Location>USA</Location>
            <SkillSet>
            <Skill>C#</Skill>
            <Skill>SQL Server 2005</Skill>
            <Skill>ASP.net</Skill>
            </SkillSet>
          <Projects>
            <Project>LowBin</Project>
            <Project>Maskin</Project>
          </Projects>
        </Employee>
      </Request>'
    
    insert into Employee (
                            EmployeeId
                            ,[Name]
                            ,Location
                            ,Skills,
                            Projects
                         )
    select newid(),
           T.N.value('Name[1]',  'nvarchar(50)'),
           T.N.value('Location[1]',  'nvarchar(50)'),
           T.N.query('SkillSet/*'),
           cast(T.N.query('Projects/*') as nvarchar(400))
    from @doc.nodes('/Request/Employee') as T(N)
    

    结果:

    BC76E37C-0C0D-4B7B-92FD-0F7807F9204B 
    Deeptechtons 
    USA 
    <Skill>C#</Skill><Skill>SQL Server005</Skill>Skill>ASP.net</Skill>
    <Project>LowBin</Project><Project>Maskin</Project>
    

    更新:

    如果出于某种原因你真的想使用 OPENXML,你可以使用它。

    insert into Employee (
                            EmployeeId
                            ,[Name]
                            ,Location
                            ,Skills,
                            Projects
                         )
                SELECT      NEWID()
                            ,[Name]
                            ,Location
                            ,Skills.query('SkillSet/*')
                            ,cast(Projects.query('Projects/*') as nvarchar(max))
                FROM OPENXML(@idoc,'Request/Employee',2)
                WITH
                        (
                            [Name] NVARCHAR(50)
                            ,Location   NVARCHAR(50)
                            ,Skills XML 'SkillSet'
                            ,Projects XML
                        )
    

    【讨论】:

    • 通过将@doc 声明为xml 数据类型,我是否会丢失任何东西,您也可以提供对T(N) 的引用吗?它是什么意思?它是如何工作的
    • @Deeptechtoons 输出相同,但性能可能有所不同。可能更快或更慢,但做你想做的事情要容易得多。 Nodes() 将 XML 分解为行,T 是保存分解后的 XML 的表别名,N 是列名。您可以随意命名它们。
    • 很抱歉打扰您,但我认为您是正确的人,可以很好地回答这个问题stackoverflow.com/questions/8740826/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多