Некоторое время я слушал блог подкастов, надеюсь, я не нарушу это. Вопрос в следующем: мне нужно вставить xml в базу данных. Это будет для уже определенных таблиц и полей. Итак, как лучше всего этого добиться? Пока я склоняюсь к программному обеспечению. Я видел варианты varios, один из них - объекты передачи данных (DTO), в SQL Server есть sp_xml_preparedocument, который используется для передачи XML-файлов в объект и сквозного кода.
Я использую CSharp и SQL Server 2005. Поля не являются полями XML, это обычные типы данных SQL.





Если ваш XML соответствует определенной схеме XSD, вы можете изучить использование инструмента командной строки «xsd.exe» для создания классов объектов C#, к которым вы можете привязать XML, а затем сформировать операторы вставки, используя свойства этих объектов: Документ MSDN XSD
Прочтите этот документ, и он предложит вам следующие варианты:
Чтобы попытаться помочь, нам могут потребоваться некоторые пояснения. Возможно, повторив проблему, вы сможете сообщить нам, если это то, о чем вы спрашиваете:
Как можно импортировать существующий xml в базу данных SQL 2005, не полагаясь на встроенный тип xml?
Довольно прямое решение, о котором вы уже упоминали, - это sp_xml_preparedocument в сочетании с openxml.
Надеюсь, следующий пример иллюстрирует правильное использование. Для более полного примера ознакомьтесь с документами MSDN на Использование OPENXML.
declare @XmlDocumentHandle int
declare @XmlDocument nvarchar(1000)
set @XmlDocument = N'<ROOT>
<Customer>
<FirstName>Will</FirstName>
<LastName>Smith</LastName>
</Customer>
</ROOT>'
-- Create temp table to insert data into
create table #Customer
(
FirstName varchar(20),
LastName varchar(20)
)
-- Create an internal representation of the XML document.
exec sp_xml_preparedocument @XmlDocumentHandle output, @XmlDocument
-- Insert using openxml allows us to read the structure
insert into #Customer
select
FirstName = XmlFirstName,
LastName = XmlLastName
from openxml ( @XmlDocumentHandle, '/ROOT/Customer',2 )
with
(
XmlFirstName varchar(20) 'FirstName',
XmlLastName varchar(20) 'LastName'
)
where ( XmlFirstName = 'Will' and XmlLastName = 'Smith' )
-- Cleanup xml document
exec sp_xml_removedocument @XmlDocumentHandle
-- Show the data
select *
from #Customer
-- Drop tmp table
drop table #Customer
Если у вас есть xml-файл и вы используете C#, то определение хранимой процедуры, которая делает что-то вроде приведенного выше, а затем передача всего содержимого xml-файла в хранимую процедуру как нить, должно дать вам довольно простой способ импорта xml в вашу существующие таблицы.
Вы можете использовать XSLT для передачи вашего XML в операторы SQL ... т.е.
<xml type = "user">
<data>1</data>
<data>2</data>
<xml>
Тогда XSLT будет выглядеть как
<xsl:template match = "xml">
INSERT INTO <xsl:value-of select = "@type" /> (data1, data2) VALUES (
'<xsl:value-of select = "data[1]" />',
'<xsl:value-of select = "data[2]" />');
</xsl:template>
Оператор match, скорее всего, не будет корневым узлом, но, надеюсь, вы поняли идею. Вам также может потребоваться обернуть части, отличные от xsl: value-of, в xsl: text, чтобы предотвратить добавление дополнительных символов в запрос. И вы должны убедиться, что вывод XSLT был текстом. При этом вы можете получить список операторов SQL, которые можно запустить через БД. или вы можете использовать XSLT для вывода оператора T-SQL, который можно загрузить как хранимую процедуру.