Я хочу передать xml-документ в хранимую процедуру сервера sql, например:
CREATE PROCEDURE BookDetails_Insert (@xml xml)
Я хочу сравнить данные некоторых полей с данными других таблиц и если это совпадает, записи должны быть вставлены в таблицу.
Требования:
Как передать XML в хранимую процедуру? Я пробовал это, но не работает: [Работает]
command.Parameters.Add (
новый SqlParameter ("@ xml", SqlDbType.Xml)
{
Значение = новый SqlXml (новый XmlTextReader (xmlToSave.InnerXml,
XmlNodeType.Document, нуль))
});
Как получить доступ к данным XML в хранимой процедуре?
Редактировать: [Работает]
String sql = "BookDetails_Insert";
XmlDocument xmlToSave = new XmlDocument();
xmlToSave.Load("C:\\Documents and Settings\\Desktop\\XML_Report\\Books_1.xml");
SqlConnection sqlCon = new SqlConnection("...");
using (DbCommand command = sqlCon.CreateCommand())
{
**command.CommandType = CommandType.StoredProcedure;**
command.CommandText = sql;
command.Parameters.Add(
new SqlParameter("@xml", SqlDbType.Xml)
{
Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
, XmlNodeType.Document, null))
});
sqlCon.Open();
DbTransaction trans = sqlCon.BeginTransaction();
command.Transaction = trans;
try
{
command.ExecuteNonQuery();
trans.Commit();
sqlCon.Close();
}
catch (Exception)
{
trans.Rollback();
sqlCon.Close();
throw;
}
Редактировать 2 : Как создать запрос выбора для выбора страниц, описание на основе некоторых условий.
<booksdetail> <isn_13>700001048</isbn_13> <isn_10>01048B</isbn_10>
<Image_URL>http://www.landt.com/Books/large/00/7010000048.jpg</Image_URL>
<title>QUICK AND FLUPKE</title> <Description> PRANKS AND JOKES QUICK AND FLUPKE </Description> </booksdetail>
Для второй части вашего вопроса см. мой ответ на Хранимая процедура: передать XML в качестве аргумента и INSERT (пары ключ/значение) для примера использования XML в хранимой процедуре.
РЕДАКТИРОВАТЬ: приведенный ниже пример кода основан на конкретном примере, приведенном в комментариях.
declare @MyXML xml
set @MyXML = '<booksdetail>
<isbn_13>700001048</isbn_13>
<isbn_10>01048B</isbn_10>
<Image_URL>http://www.landt.com/Books/large/00/70100048.jpg</Image_URL>
<title>QUICK AND FLUPKE</title>
<Description> PRANKS AND JOKES QUICK AND FLUPKE - CATASTROPHE QUICK AND FLUPKE </Description>
</booksdetail>'
select Book.detail.value('(isbn_13/text())[1]','varchar(100)') as isbn_13,
Book.detail.value('(isbn_10/text())[1]','varchar(100)') as isbn_10,
Book.detail.value('(Image_URL/text())[1]','varchar(100)') as Image_URL,
Book.detail.value('(title/text())[1]','varchar(100)') as title,
Book.detail.value('(Description/text())[1]','varchar(100)') as Description
from @MyXML.nodes('/booksdetail') as Book(detail)
Как указано в http://support.microsoft.com/kb/555266, данные xml необходимо передавать как NText.
Вы можете запросить XML-переменную следующим образом:
DECLARE @PeopleXml XML
SET @PeopleXml = '<People>
<Person>
<Name>James</Name>
<Age>28</Age>
</Person>
<Person>
<Name>Jane</Name>
<Age>24</Age>
</Person>
</People>'
-- put [1] at the end to ensure the path expression returns a singleton.
SELECT p.c.value('Person[1]/Name[1]', 'varchar(50)')
FROM @PeopleXml.nodes('People') p(c) -- table and column aliases
Вы будете использовать xPath и XQuery в основном для запроса и изменения данных XML.
Вот хорошая отправная точка http://msdn.microsoft.com/en-us/library/ms190798.aspx.
Я не могу сказать что-то более конкретное, потому что ваш вопрос очень расплывчатый. Пожалуйста, задавайте конкретные вопросы о том, как что-то сделать, если вам нужна помощь в использовании XPath и XQuery.