Хранение XML-файла в SQL Server 2008 R2 Express

Я пытаюсь сохранить XML-данные в базе данных SQL Server 2008 R2 Express, каждый XML-файл имеет разные данные. Как это сделать проще всего?

Каковы наилучшие варианты, пожалуйста, объясните на примере.


person user3202862    schedule 03.06.2014    source источник
comment
Используйте столбец типа XML, сохраните XML внутри этого столбца....   -  person marc_s    schedule 03.06.2014
comment
@marc_s как мне это сделать   -  person user3202862    schedule 03.06.2014
comment
См., например. stackoverflow.com/questions/18090977/   -  person marc_s    schedule 03.06.2014


Ответы (2)


Хорошо, это пример хранения значений xml в таблице. Я не пробовал этот код, но он должен работать, но, по крайней мере, он должен прояснить, как поступить, как ожидалось.

   /* Imagine your xml looks something like this

    <Content>
        <Title>Text</Title>
        <Value>15</Value>
    </Content>
    */

    CREATE TABLE [dbo].[MyXmlStorage] 
    ( 
        [Id] [int] IDENTITY(1,1) NOT NULL, 
        [Title] [nvarchar](100) NOT NULL, 
        [Value] int NOT NULL,

        CONSTRAINT [PK_MyXmlStorage] 
        PRIMARY KEY CLUSTERED  ([Id] ASC)
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

    CREATE PROCEDURE [dbo].[InsertXml]
        (@filePathFull nvarchar(255)) 
    AS 
       DECLARE @xmlAsString VARCHAR(MAX) 
       DECLARE @sql nvarchar(max) 
       DECLARE @xml XML 
       DECLARE @Rms_FileId nvarchar(50) 
       DECLARE @Rms_Id nvarchar(50) 
       DECLARE @Rms_Type nvarchar(50) 
       DECLARE @Rms_Timestamp nvarchar(50) 

    BEGIN 
        SET @sql = 'SELECT @xmlAsString = x.y FROM OPENROWSET( BULK ''' + RTRIM(@filePathFull) + ''', SINGLE_CLOB) x(y)' 
        exec sp_executesql @sql,N'@xmlAsString VARCHAR(MAX) OUTPUT',@xmlAsString OUTPUT 

        set @xml = CONVERT(XML,@xmlAsString)  

        /* Use xpath to query nodes for values inside the Content tag*/
        INSERT INTO MyXmlStorage([Title],[Value]) 
        SELECT 
            x.y.value('title[1]/text()[1]', 'nvarchar(100)') AS title,
            x.y.value('value[1]/text()[1]', 'int') AS value
        FROM @xml.nodes('//Content') AS x(y)
    END 
)
person JFM    schedule 04.06.2014

Я считаю, что самым простым способом будет создание хранимой процедуры для обработки хранилища для вас. Затем вы можете получить его с помощью предпочтительного ORM и позволить C# десериализовать его для вас.

CREATE TABLE [dbo].[MyXmlStorage] 
( 
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [FileName] [nvarchar](255) NOT NULL, 
    [Xml] [xml] NOT NULL, 

    CONSTRAINT [PK_MyXmlStorage] 
    PRIMARY KEY CLUSTERED  ([Id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

CREATE PROCEDURE [dbo].[InsertXml]
    (@filePathFull nvarchar(255)) 
AS 
   DECLARE @xmlAsString VARCHAR(MAX) 
   DECLARE @sql nvarchar(max) 
   DECLARE @xml XML 
   DECLARE @Rms_FileId nvarchar(50) 
   DECLARE @Rms_Id nvarchar(50) 
   DECLARE @Rms_Type nvarchar(50) 
   DECLARE @Rms_Timestamp nvarchar(50) 

BEGIN 
    SET @sql = 'SELECT @xmlAsString = x.y FROM OPENROWSET( BULK ''' + RTRIM(@filePathFull) + ''', SINGLE_CLOB) x(y)' 
    exec sp_executesql @sql,N'@xmlAsString VARCHAR(MAX) OUTPUT',@xmlAsString OUTPUT 

    set @xml = CONVERT(XML,@xmlAsString)  

    INSERT INTO MyXmlStorage([FileName],[Xml]) 
    VALUES (@filePathFull, @xml) 
END 

Затем запустите его следующим образом:

exec InsertXml N'C:\files\xmlfile.xml'
person JFM    schedule 03.06.2014
comment
Если вы публикуете образцы кода, XML или данных, ПОЖАЛУЙСТА, выделите эти строки в текстовом редакторе и нажмите кнопку образцов кода ( { } ) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! Таким образом, вам также не нужны никакие грязные теги <br/>! - person marc_s; 03.06.2014
comment
Спасибо за прояснение этого, немного расстроился там на некоторое время :) - person JFM; 03.06.2014
comment
@JFM Большое спасибо, это сработало, но я хочу сохранить каждое значение элемента xml, а не весь xml-файл в виде строки. - person user3202862; 04.06.2014