Se muestran los artículos pertenecientes a Septiembre de 2007.

06/09/2007

Consultas SQL para modificar el resultado de una columna en base a una condición (Transact-SQL)

Hay veces que tenemos la necesidad de obtener un resultado diferente al de una columna en base a este. Por ejemplo, podriamos necesitar que una columna nos indicase si tiene o no informado valor de una forma más legible indicando 'CIERTO' o 'FALSO'.

Para lograr esto utilizamos la función CASE de Transact-SQL:

CASE
     WHEN Boolean_expression THEN result_expression
    [ ...n ]
     [
    ELSE else_result_expression
     ]
END

Como ejemplo de uso podriamos utilizar una consulta que indicaque si un contacto dispone de telefono para contactar con él:

SELECT FirstName, Lastname, 'Has Telephone to Contact' =
     CASE
          WHEN TelephoneNumber IS NULL THEN CAST (0 AS BIT)
          ELSE CAST (1 AS BIT)
     END

06/09/2007 11:44 Autor: elguru. Enlace permanente. Tema: Programación No hay comentarios. Comentar.

12/09/2007

Obtener un conjunto de tablas en un DataSet (.NET)

Si bien un DataAdapter crea varias tablas en el DataSet cuando encuentra múltiples conjuntos de resultados -tablas devueltas a una o varias consultas sql-, pueden existir casos en los que nos sea necesario obtener la misma funcionalidad en una consulta que devuelve el conjunto de resultado en el formato XML que devuelven las consultas ejecutadas con FOR XML. Por ejemplo la siguiente consulta SQL:

SELECT *
FROM [PLPC_Agrupacio]
FOR XML RAW, XMLDATA

Cuyo resultado será:

<Schema name="Schema3" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<
ElementType name="row" content="empty" model="closed">
<
AttributeType name="PLPC_AgrupacioId" dt:type="i4" />
<
AttributeType name="PLPC_ConvocatoriaId" dt:type="uuid" />
<
AttributeType name="PLPC_CodiAgrupacio" dt:type="i4" />
<
AttributeType name="PLPC_AgrupacioNom" dt:type="string" />
<
attribute type="PLPC_AgrupacioId" />
<
attribute type="PLPC_ConvocatoriaId" />
<
attribute type="PLPC_CodiAgrupacio" />
<
attribute type="PLPC_AgrupacioNom" />
</
ElementType>
</
Schema>
<
row xmlns="x-schema:#Schema3" PLPC_AgrupacioId="40" PLPC_ConvocatoriaId="081F2367-1121-4804-B66A-DAA92A89F3C8"
PLPC_CodiAgrupacio
="1" PLPC_AgrupacioNom="grup 1" />
<
row xmlns="x-schema:#Schema3" PLPC_AgrupacioId="41" PLPC_ConvocatoriaId="081F2367-1121-4804-B66A-DAA92A89F3C8" PLPC_CodiAgrupacio="2" PLPC_AgrupacioNom="grup 2" />
<
row xmlns="x-schema:#Schema3" PLPC_AgrupacioId="42" PLPC_ConvocatoriaId="081F2367-1121-4804-B66A-DAA92A89F3C8" PLPC_CodiAgrupacio="3" PLPC_AgrupacioNom="grup 3" />

Para ello utilizaremos un DataSet y el método ReadXml de este. Mediante el parametro mode, que es del tipo XmlReadMode -una enumeración-, le indicaremos que utilize el modo ReadSchema que lee cualquier esquema en línea y carga los datos de modo que si el DataSet ya contiene un esquema se agregan las nuevas tablas -se lanza una excepción si cualquier tabla del esquema en línea ya existe en el DataSet.

SqlConnection dataBaseConnection = null;
SqlCommand dataBaseCommand;
SqlDataReader dataBaseReader = null;
StringBuilder xmlResult = new StringBuilder();
DataSet result = new DataSet ();
System.IO.StringReader reader;

dataBaseConnection = new SqlConnection(connectionString);
dataBaseCommand = new SqlCommand("PLPC_SP_ObtenirAgrupacions", dataBaseConnection);
dataBaseCommand.CommandType = CommandType.StoredProcedure;
dataBaseCommand.Parameters.Add("@PLPC_ConvocatoriaId", SqlDbType.UniqueIdentifier).Value = convocatoriaId;

dataBaseConnection.Open();
dataBaseReader = dataBaseCommand.ExecuteReader();xmlResult.Append ("<root>");
while (dataBaseReader.Read())
{
    xmlResult.Append (dataBaseReader.GetString(0));
}

xmlResult.Append ("</root>");
reader = new System.IO.StringReader (xmlResult.ToString());
result.ReadXml (reader, XmlReadMode.ReadSchema);
dataBaseReader.Close();
result.Tables[0].TableName = "PLPC_Agrupacio";
dataBaseCommand.CommandText = "PLPC_SP_ObtenirPlans";
dataBaseCommand.CommandType = CommandType.StoredProcedure;
xmlResult.Remove (0, xmlResult.Length);
xmlResult.Append ("<root>");

dataBaseReader = dataBaseCommand.ExecuteReader(CommandBehavior.CloseConnection);
while (dataBaseReader.Read())
{
    xmlResult.Append (dataBaseReader.GetString(0));
}
xmlResult.Append ("</root>");
reader = new System.IO.StringReader (xmlResult.ToString());
result.ReadXml (reader, XmlReadMode.ReadSchema);
dataBaseReader.Close();
result.Tables[1].TableName = "PLPC_Pla";
result.DataSetName = "Convocatoria";

Con este metodo es necesario ejecutar varias consultas asi que estoy abierto a metodos mejores.

No hay que olvidar que las relaciones entre las tablas y las restricciones dentro del DataSet y las deberemos crear mediante código una vez devuelto el conjunto de resultados.

12/09/2007 16:33 Autor: elguru. Enlace permanente. Tema: Programación No hay comentarios. Comentar.


Blog creado con Blogia. Derechos de autor con . Estadísticas. Suscribir RSS. Admin.
Blogia apoya: Fundación Josep Carreras, y Evento Blog España. Vota en los Premios Bitacoras.com [Blog Oficial en LaInformacion.com]