Saltar al contenido

2

Parece una tarea sencilla borrar todas las tablas de una base de datos, pero se puede complicar cuando o tenemos muchas tablas o existen relaciones entre ellas.database
Dejo un script para esto:

-- Primero desabilitar la integridad referencial
 EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
 GO
EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"
-- Ahora volver a habilitar la integridad referencial
 EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
 GO

Estos días he estado bastante liado ya que el proceso que teníamos de carga de XML realizaba una precarga en memoria del archivo (método Load()), la solución que hay es bastante sencilla con un XMLReader, os pongo un fragmento que seguro se entiende:

using (XmlReader reader = XmlReader.Create(directoryTemp + fichero))
{
 reader.MoveToContent();
 
 int count = 0; // una variable contador XElement nombretabla = null; // un XElement auxiliar
 
 while (!reader.EOF)
 {
 switch (reader.NodeType)
 {
 case XmlNodeType.Element: // se puede filtrar por tipo de XmlNodeType...
 if (count == 0)
 {
 // CUALQUIER CONDICION
 count++;
 reader.Read();
 
 } else if (count == 1)
 {
 nombretabla = new XElement((XName)reader.Name); // esto para crear un XELEMENT con el nombre del Reader actual
 count++;
 reader.Read();
 } else
 {
 if (string.IsNullOrEmpty(nodoReg)) nodoReg = reader.Name; // condicion para omitir anidados..
 
 if (nodoReg == reader.Name)
 {
 count++;
 nombretabla.Add(XElement.ReadFrom(reader) as XElement);
 
 // INSERCION .. cada X lanzo una inserción en BD
 if (count % numInserciones == 0)
 {
 nombrecondicionado.Add(nombretabla);
 docaux.Add(nombrecondicionado);
 
 // VALIDACION ...
 validado = ValidarEsquema(docaux, esquema);
 
 if (validado)
 {
 nreg += cond.Insertar(docaux, delete);
 delete = false;
 
 // vacio contenidos
 nombretabla.Elements().Remove();
 nombrecondicionado.Elements().Remove();
 docaux.Elements().Remove();
 }
 else
 {
 OnReportInformation(string.Format("ERROR fichero{0} no valido.", fichero), ReportLevel.Error);
 EstadoCarga = 2;
 }
 }
 
 }
 
 }
 break;
 
 default :
 reader.Read();
 break;
 
 }
 
 }
 // INSERCION DE LOS ULTIMOS QUE NO ENTRAN EN EL ÚLTIMO WHILE
 nombrecondicionado.Add(nombretabla);
 docaux.Add(nombrecondicionado);
 
 // VALIDACION
 validado = ValidarEsquema(docaux, esquema);
 
 if (validado)
 {
 nreg += cond.Insertar(docaux, delete);
 
 // vacio contenidos
 nombretabla.Elements().Remove();
 nombrecondicionado.Elements().Remove();
 docaux.Elements().Remove();
 }
 else
 {
 OnReportInformation(string.Format("ERROR fichero{0} no valido.", fichero), ReportLevel.Error);
 EstadoCarga = 2;
 }
 
}

  1. En el directorio /bin de TOMCAT debemos dejar el driver, en mi caso el sqljdbc.jar para SQLServer 2005
  2. Modificar el archivo conf/context.xml y añadir para SQLServer 2005:

<Resource name="general" auth="Container"
type="javax.sql.DataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://[SERVER]:1433;databaseName=[NameBBDD];user=[user];password=[password];"
maxActive="20" maxIdle="10"
maxWait="-1"/>

* Nota: En las pruebas que hemos hecho, para el caso de SQL Server 2005, hay que crear un usuario de autenticación SQL Server y no de login de Windows (autologin con la propia sesión), ya que comprobamos que el driver rechaza las conexiones.

Los campos puestos en negrita pueden variar en función de la instalación que se realice del motor de la BBDD:

jdbc:sqlserver://(servidor):(puerto);databaseName=(BBDD);user=(usuario);password=(password);

Bueno muchas veces nos gustaría sacar del SQL Server un monton de INSERTS para tenerlo en un script para ejecutar cuando quieras. Os propongo una opción sencilla y adaptable:

SELECT  'INSERT INTO nombretabla(campo1,campo2)values (' + Convert(varchar, campo1) + ',' 
          + Convert(varchar, campo2) +  ');'
FROM tuTabla

2

Tenemos un campo nvarchar(1) de la base de datos que se introduce con un carácter extraño, modificamos la carga y se introducían bien pero había que cambiar las ya existentes. Para ello se pensó en muchas cosas (codificación, tamaño de la cadena, etc) dando al final con esta solución:

Problema:
cuadraditos

Solución:
UPDATE Esquema.Tabla
SET Campo = 'valorquequeremos'
WHERE ASCII(Campo) = 0

La sintaxis es la siguiente:

[Instrucción SQL 1]
UNION
[Instrucción SQL 2]

Supongamos que tenemos las siguientes dos tablas,

Tabla Store_Information
store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Tabla Internet_Sales
Date Sales
07-Jan-1999 250 €
10-Jan-1999 535 €
11-Jan-1999 320 €
12-Jan-1999 750 €

y deseamos saber de todas las fechas donde hay una operación de venta. Para hacerlo, utilizamos la siguiente instrucción SQL:

SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales

Resultado:

Date
05-Jan-1999
07-Jan-1999
08-Jan-1999
10-Jan-1999
11-Jan-1999
12-Jan-1999

Lo único que hay que tener en cuenta es que los campos que queremos unir sean del mismo tipo en ambas consultas a la vez de que tengan el mismo nombre.

ALTER SCHEMA Comisiones TRANSFER dbo.GestoresComerciales;
GO

Con esta consulta cambiamos la tabla dbo.GestoresComerciales del esquema "dbo" al esquema "Comisiones"

Más información en: http://msdn.microsoft.com/es-es/library/ms173423.aspx

Las constraints de una tabla de SQL Server se pueden desactivar temporalmente con la opción NOCHECK CONSTRAINT ALL de ALTER TABLE.
El comando quedaría así:

 ALTER TABLE tabla NOCHECK CONSTRAINT ALL;

Con esto se desactivan y puedes hacer la carga de datos sin que te molesten las FK

Después, para volver a activarlas sólo tienes que hacer este otro ALTER TABLE:

 ALTER TABLE tabla WITH CHECK CHECK CONSTRAINT ALL;

Reactiva las constraints chequeando que los datos de las tablas las cumplan

Si quieres volver a habilitarlas sin validar los datos que hayas cargado, aunque no es muy recomendable también se puede hacer:

 ALTER TABLE tabla CHECK CONSTRAINT ALL;