usar tabla stored salida procedimientos procedimiento pasar parametros parametro manejo ejemplo descomponer convertir como almacenados almacenado c# sql-server xml stored-procedures sqlparameters

tabla - ¿Cómo pasar XML de C#a un procedimiento almacenado en SQL Server 2008?



sql server parametro xml (4)

Quiero pasar el documento xml al procedimiento almacenado del servidor SQL como este:

CREATE PROCEDURE BookDetails_Insert (@xml xml)

Quiero comparar algunos datos de campo con otros datos de tabla y, si coinciden, los registros deben estar insertados en la tabla.

Requisitos:

  1. ¿Cómo paso XML al procedimiento almacenado? Intenté esto, pero no funciona: [Trabajo]

    command.Parameters.Add( new SqlParameter("@xml", SqlDbType.Xml) { Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml, XmlNodeType.Document, null)) });

  2. ¿Cómo accedo a los datos XML dentro del procedimiento almacenado?

Editar: [Trabajo]

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; }

Editar 2 : Cómo crear una consulta de selección para seleccionar páginas, descripción basada en algunas condiciones.

<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>


Como se indica en http://support.microsoft.com/kb/555266 , debe pasar datos xml como NText.

Puede consultar una variable XML de la siguiente manera:

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


Para la parte 2 de su pregunta, vea mi respuesta al procedimiento almacenado: pasar XML como argumento e INSERTAR (pares clave / valor) para ver un ejemplo de cómo usar XML dentro de un procedimiento almacenado.

EDITAR : El código de muestra a continuación se basa en el ejemplo específico dado en los comentarios.

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)


Usará xPath y XQuery principalmente para consultar y modificar datos XML.

Este es un buen punto de partida http://msdn.microsoft.com/en-us/library/ms190798.aspx .

No puedo ser más específico porque tu pregunta es extremadamente vaga. Haga preguntas específicas sobre cómo hacer algo si quiere ayuda con el uso de XPath y XQuery.


public static string UpdateStaticCertificateFormateNo1Data(StaticCertificateFormatNo1LogicLayer StaticFormat1Detail) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()); con.Open(); string strXMLRegistrationDetails, strXMLQutPut = "<root></root>"; System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(StaticFormat1Detail.GetType()); System.IO.MemoryStream stream = new System.IO.MemoryStream(); x.Serialize(stream, StaticFormat1Detail); stream.Position = 0; XmlDocument xd = new XmlDocument(); xd.Load(stream); strXMLRegistrationDetails = xd.InnerXml; SqlTransaction trn = con.BeginTransaction(); try { SqlParameter[] paramsToStore = new SqlParameter[2]; paramsToStore[0] = ControllersHelper.GetSqlParameter("@StaticFormat1Detail", strXMLRegistrationDetails, SqlDbType.VarChar); paramsToStore[1] = ControllersHelper.GetSqlParameter("@OutPut", strXMLQutPut, SqlDbType.VarChar); SqlHelper.ExecuteNonQuery(trn, CommandType.StoredProcedure, "UPS_UpdateStaticCertificateFormateNo1Detail", paramsToStore); trn.Commit(); } catch (Exception ex) { trn.Rollback(); con.Close(); if (ex.Message.Contains("UNIQUE KEY constrastring")) { return "Details already in List"; } else { return ex.Message; } } con.Close(); return "Details successfully Added..."; }