Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
lunes, 14 de abril de 2014
que tablas tienen mas registros TSQL
Muchas Veces al tratar de administrar una BD nos topamos con el problema de saber que tablas dentro de nuestra base tienen mas registros y cuales son objetivo de depuracion, para poder hacer esta consulta al mismo motor de la base de datos, nos colocamos en la base que queremos analizar y utulizamos el siguiente codigo:
select top 10 name,row_count(db_id(), id)
from sysobjects
order by row_count(db_id(),id) desc
este codigo es util para sybase, en sql server tiene sus modificaciones con el comando sp_helpdb o sp_spaceused
viernes, 24 de febrero de 2012
miércoles, 22 de febrero de 2012
actualizacion de campo en segunda tabla con trigger
alter TRIGGER updateAprobadas
ON pantallas
AFTER insert
AS
BEGIN
SET NOCOUNT ON;
update aprobadas set id_pantalla = INSERTED.id_pantalla from inserted
where aprobadas.contrato = INSERTED.contrato
and aprobadas.id_mesayo = INSERTED.id_mesayo
and aprobadas.dia=INSERTED.dia
End
GO
ON pantallas
AFTER insert
AS
BEGIN
SET NOCOUNT ON;
update aprobadas set id_pantalla = INSERTED.id_pantalla from inserted
where aprobadas.contrato = INSERTED.contrato
and aprobadas.id_mesayo = INSERTED.id_mesayo
and aprobadas.dia=INSERTED.dia
End
GO
martes, 7 de febrero de 2012
administracion de sql server
--espacio disponible en discos duros
EXEC master..xp_fixeddrives
--fechas desde la ultamia creacion de respaldo de bases de datos
SELECT B.name as Database_Name, ISNULL(STR(ABS(DATEDIFF(day, GetDate(),
MAX(Backup_finish_date)))), 'NUNCA') as DaysSinceLastBackup,
ISNULL(Convert(char(10), MAX(backup_finish_date), 101), 'NUNCA') as LastBackupDate
FROM master.dbo.sysdatabases B LEFT OUTER JOIN msdb.dbo.backupset A
ON A.database_name = B.name AND A.type = 'D' GROUP BY B.Name ORDER BY B.name
--tamaño de bases de datos
--exec sp_helpdb 'captura'
use captura exec sp_spaceused
--use master exec sp_helptext 'sp_spaceused'
EXEC master..xp_fixeddrives
--fechas desde la ultamia creacion de respaldo de bases de datos
SELECT B.name as Database_Name, ISNULL(STR(ABS(DATEDIFF(day, GetDate(),
MAX(Backup_finish_date)))), 'NUNCA') as DaysSinceLastBackup,
ISNULL(Convert(char(10), MAX(backup_finish_date), 101), 'NUNCA') as LastBackupDate
FROM master.dbo.sysdatabases B LEFT OUTER JOIN msdb.dbo.backupset A
ON A.database_name = B.name AND A.type = 'D' GROUP BY B.Name ORDER BY B.name
--tamaño de bases de datos
--exec sp_helpdb 'captura'
use captura exec sp_spaceused
--use master exec sp_helptext 'sp_spaceused'
viernes, 3 de febrero de 2012
viernes, 20 de enero de 2012
habilitar full-text index con tsql
-- Verificamos que se posea el servicio Full_Text Engine
use master
SELECT fulltextserviceproperty('isfulltextinstalled')
-- Consulta si la base de datos tiene instalado el servicio Full_Text
use master
SELECT DATABASEPROPERTY('baseDeDatos', 'IsFullTextEnabled');
-- Si no lo tiene, lo instalamos
use baseDeDatos
EXEC sp_fulltext_database 'ENABLE'
use master
SELECT fulltextserviceproperty('isfulltextinstalled')
-- Consulta si la base de datos tiene instalado el servicio Full_Text
use master
SELECT DATABASEPROPERTY('baseDeDatos', 'IsFullTextEnabled');
-- Si no lo tiene, lo instalamos
use baseDeDatos
EXEC sp_fulltext_database 'ENABLE'
martes, 4 de octubre de 2011
No funciona not in en TSQL
El dia de ayer un compañero estaba realizando una consulta de la siguiente forma:
SELECT * from tabla_claves where clave not in
(SELECT clave from claves_alta)
y la consulta no le devolvia resultados a pesar de que habia dos registros en la tabla_claves que no existian en la tabla claves_alta, y nuestra sorpresa fue darnos cuenta de que si cambiabamos el select seguido del in por las claves escritas directamente, funcionaba.
¿Por que dejo de funcionar el siempre popular "not in"?, pues nos dimos cuenta que la tabla claves_alta tenia un registro con el campo clave en valor NULL, esto provocaba que no funcionara la consulta correctamente, para que no tengan problemas con esta clausula, verifiquen que el conjunto de datos que van a comparar dentro de la clausula "not in", no contenga registros NULL
SELECT * from tabla_claves where clave not in
(SELECT clave from claves_alta)
y la consulta no le devolvia resultados a pesar de que habia dos registros en la tabla_claves que no existian en la tabla claves_alta, y nuestra sorpresa fue darnos cuenta de que si cambiabamos el select seguido del in por las claves escritas directamente, funcionaba.
¿Por que dejo de funcionar el siempre popular "not in"?, pues nos dimos cuenta que la tabla claves_alta tenia un registro con el campo clave en valor NULL, esto provocaba que no funcionara la consulta correctamente, para que no tengan problemas con esta clausula, verifiquen que el conjunto de datos que van a comparar dentro de la clausula "not in", no contenga registros NULL
viernes, 25 de febrero de 2011
CUBOS SQL SERVER
para todos aquellos que escuchaban hablar de los cubos pero temian preguntar...
http://technet.microsoft.com/es-es/library/ms175680%28SQL.90%29.aspx
http://technet.microsoft.com/es-es/library/ms175680%28SQL.90%29.aspx
miércoles, 23 de febrero de 2011
Triggers Transact SQL
Un trigger( o desencadenador) es una clase especial de procedimiento almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos.
SQL Server proporciona los siguientes tipos de triggers:
*
Trigger DML, se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
*
Trigger DDL, se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.
Trigger DML.
Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER
ON
AFTER
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
END
Antes de ver un ejemplo es necesario conocer las tablas inserted y deleted.
Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted y deleted. SQL Server 2005 crea y administra automáticamente ambas tablas. La estructura de las tablas inserted y deleted es la misma que tiene la tabla que ha desencadenado la ejecución del trigger.
La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en ella están los valores resultantes despues de la inserción o actualización. Es decir, los datos insertados. Inserted estará vacia en una operación DELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores anteriores a la ejecución de la actualización o borrado. Es decir, los datos que serán borrados. Deleted estará vacia en una operacion INSERT.
¿No existe una tabla UPDATED? No, hacer una actualización es lo mismo que borrar (deleted) e insertar los nuevos (inserted). La sentencia UPDATE es la única en la que inserted y deleted tienen datos simultaneamente.
No puede se modificar directamente los datos de estas tablas.
El siguiente ejemplo, graba un historico de saldos cada vez que se modifica un saldo de la tabla cuentas.
CREATE TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
La siguiente instrucción provocará que el trigger se ejecute:
UPDATE CUENTAS
SET SALDO = SALDO + 10
WHERE IDCUENTA = 1
Una consideración a tener en cuenta es que el trigger se ejecutará aunque la instruccion DML (UPDATE, INSERT o DELETE ) no haya afectado a ninguna fila. En este caso inserted y deleted devolveran un conjunto de datos vacio.
Podemos especificar a que columnas de la tabla debe afectar el trigger.
ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
IF UPDATE(SALDO) -- Solo si se actualiza SALDO
BEGIN
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
END
Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger sino también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la transacción de Insert, Delete o Update volverá toda hacia atrás.
ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
ROLLBACK
END
En este caso obtendremos el siguiente mensaje de error:
La transacción terminó en el desencadenador. Se anuló el lote.
Podemos activar y desactivar Triggers a tarvés de las siguientes instrucciones.
-- Desactiva el trigger TR_CUENTAS
DISABLE TRIGGER TR_CUENTAS ON CUENTAS
GO
-- activa el trigger TR_CUENTAS
ENABLE TRIGGER TR_CUENTAS ON CUENTAS
GO
-- Desactiva todos los trigger de la tabla CUENTAS
ALTER TABLE CUENTAS DISABLE TRIGGER ALL
GO
-- Activa todos los trigger de la tabla CUENTAS
ALTER TABLE CUENTAS ENABLE TRIGGER ALL
Trigger DDL
Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER
ON DATABASE
FOR
AS
BEGIN
...
END
La siguiente instrucción impide que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de datos.
CREATE TRIGGER TR_SEGURIDAD
ON DATABASE FOR DROP_TABLE, ALTER_TABLE
AS
BEGIN
RAISERROR ('No está permitido borrar ni modificar tablas !' , 16, 1)
ROLLBACK TRANSACTION
END
SQL Server proporciona los siguientes tipos de triggers:
*
Trigger DML, se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
*
Trigger DDL, se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.
Trigger DML.
Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER
ON
AFTER
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
END
Antes de ver un ejemplo es necesario conocer las tablas inserted y deleted.
Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted y deleted. SQL Server 2005 crea y administra automáticamente ambas tablas. La estructura de las tablas inserted y deleted es la misma que tiene la tabla que ha desencadenado la ejecución del trigger.
La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en ella están los valores resultantes despues de la inserción o actualización. Es decir, los datos insertados. Inserted estará vacia en una operación DELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores anteriores a la ejecución de la actualización o borrado. Es decir, los datos que serán borrados. Deleted estará vacia en una operacion INSERT.
¿No existe una tabla UPDATED? No, hacer una actualización es lo mismo que borrar (deleted) e insertar los nuevos (inserted). La sentencia UPDATE es la única en la que inserted y deleted tienen datos simultaneamente.
No puede se modificar directamente los datos de estas tablas.
El siguiente ejemplo, graba un historico de saldos cada vez que se modifica un saldo de la tabla cuentas.
CREATE TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
La siguiente instrucción provocará que el trigger se ejecute:
UPDATE CUENTAS
SET SALDO = SALDO + 10
WHERE IDCUENTA = 1
Una consideración a tener en cuenta es que el trigger se ejecutará aunque la instruccion DML (UPDATE, INSERT o DELETE ) no haya afectado a ninguna fila. En este caso inserted y deleted devolveran un conjunto de datos vacio.
Podemos especificar a que columnas de la tabla debe afectar el trigger.
ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
IF UPDATE(SALDO) -- Solo si se actualiza SALDO
BEGIN
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
END
END
Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger sino también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la transacción de Insert, Delete o Update volverá toda hacia atrás.
ALTER TRIGGER TR_CUENTAS
ON CUENTAS
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- con cada instrucción
SET NOCOUNT ON;
INSERT INTO HCO_SALDOS
(IDCUENTA, SALDO, FXSALDO)
SELECT IDCUENTA, SALDO, getdate()
FROM INSERTED
ROLLBACK
END
En este caso obtendremos el siguiente mensaje de error:
La transacción terminó en el desencadenador. Se anuló el lote.
Podemos activar y desactivar Triggers a tarvés de las siguientes instrucciones.
-- Desactiva el trigger TR_CUENTAS
DISABLE TRIGGER TR_CUENTAS ON CUENTAS
GO
-- activa el trigger TR_CUENTAS
ENABLE TRIGGER TR_CUENTAS ON CUENTAS
GO
-- Desactiva todos los trigger de la tabla CUENTAS
ALTER TABLE CUENTAS DISABLE TRIGGER ALL
GO
-- Activa todos los trigger de la tabla CUENTAS
ALTER TABLE CUENTAS ENABLE TRIGGER ALL
Trigger DDL
Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER
ON DATABASE
FOR
AS
BEGIN
...
END
La siguiente instrucción impide que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de datos.
CREATE TRIGGER TR_SEGURIDAD
ON DATABASE FOR DROP_TABLE, ALTER_TABLE
AS
BEGIN
RAISERROR ('No está permitido borrar ni modificar tablas !' , 16, 1)
ROLLBACK TRANSACTION
END
miércoles, 2 de febrero de 2011
formato monetario en tsql
con esta funcion podemos recibir cualquier cadena numerica y ponerla con formato monetario es decir dos digitos para los centavos, y comas cada 3 digitos de derecha a izquierda
create function stringToMoney(@numero as varchar(100))
returns varchar(100)
as
begin
declare @partes as varchar(100)
set @partes =''
if LEN(@numero)>3
begin
--esta parte puede omitirse para el caso de numeros sin centavos
set @partes = '.'+SUBSTRING (@numero,LEN(@numero)-1,2)
set @numero = SUBSTRING (@numero,1,LEN(@numero)-2)
----------------------------------------------------------------
while (LEN(@numero)>3)
begin
set @partes = ','+SUBSTRING (@numero,LEN(@numero)-2,3)+@partes
set @numero = SUBSTRING (@numero,1,LEN(@numero)-3)
end
set @partes = @numero + @partes
end
return @partes
end
--asi se ejecutaria
select dbo.stringToMoney('463743497786') as [numero como dato], 'tus otros datos' as datos
create function stringToMoney(@numero as varchar(100))
returns varchar(100)
as
begin
declare @partes as varchar(100)
set @partes =''
if LEN(@numero)>3
begin
--esta parte puede omitirse para el caso de numeros sin centavos
set @partes = '.'+SUBSTRING (@numero,LEN(@numero)-1,2)
set @numero = SUBSTRING (@numero,1,LEN(@numero)-2)
----------------------------------------------------------------
while (LEN(@numero)>3)
begin
set @partes = ','+SUBSTRING (@numero,LEN(@numero)-2,3)+@partes
set @numero = SUBSTRING (@numero,1,LEN(@numero)-3)
end
set @partes = @numero + @partes
end
return @partes
end
--asi se ejecutaria
select dbo.stringToMoney('463743497786') as [numero como dato], 'tus otros datos' as datos
lunes, 17 de enero de 2011
convertir numeros en letras tsql
Para realizar este proceso se utilizan 4 funciones que detallo a continuacion:
1.
CREATE FUNCTION Convi_FindNum( @Cual Int )
RETURNS nVarChar(Max)
AS BEGIN
Declare @Resu nVarChar(Max)
Set @Resu = Case @Cual
When 1 Then 'uno'
When 2 Then 'dos'
When 3 Then 'tres'
When 4 Then 'cuatro'
When 5 Then 'cinco'
When 6 Then 'seis'
When 7 Then 'siete'
When 8 Then 'ocho'
When 9 Then 'nueve'
When 10 Then 'diez'
When 11 Then 'once'
When 12 Then 'doce'
When 13 Then 'trece'
When 14 Then 'catorce'
When 15 Then 'quince'
When 16 Then 'dieciseis'
When 17 Then 'diecisiete'
When 18 Then 'dieciocho'
When 19 Then 'diecinueve'
When 20 Then 'veinte'
When 30 Then 'treinta'
When 40 Then 'cuarenta'
When 50 Then 'cincuenta'
When 60 Then 'sesenta'
When 70 Then 'setenta'
When 80 Then 'ochenta'
When 90 Then 'noventa'
When 100 Then 'cien'
Else Case
When @Cual <= 29 Then 'veinti*'
When @Cual <= 39 Then 'treinta y *'
When @Cual <= 49 Then 'cuarenta y *'
When @Cual <= 59 Then 'cincuenta y *'
When @Cual <= 69 Then 'sesenta y *'
When @Cual <= 79 Then 'setenta y *'
When @Cual <= 89 Then 'ochenta y *'
When @Cual <= 99 Then 'noventa y *'
When @Cual <= 199 Then 'ciento *'
When @Cual <= 299 Then 'doscientos *'
When @Cual <= 399 Then 'trescientos *'
When @Cual <= 499 Then 'cuatrocientos *'
When @Cual <= 599 Then 'quinientos *'
When @Cual <= 699 Then 'seiscientos *'
When @Cual <= 799 Then 'setecientos *'
When @Cual <= 899 Then 'ochocientos *'
When @Cual <= 999 Then 'novecientos *'
When @Cual <= 1999 Then 'un mil *'
When @Cual <= 9999 Then '# mil *'
When @Cual <= 99999 Then '## mil *'
When @Cual <= 999999 Then '### mil *'
When @Cual <= 1999999 Then 'un millón *'
When @Cual <= 9999999 Then '# millones *'
When @Cual <= 99999999 Then '## millones *'
When @Cual <= 999999999 Then '### millones *'
When @Cual <= 999999999 Then '### millones *'
Else ''
End
End
RETURN @Resu
END
2.
CREATE FUNCTION Convi_PreConvierte
( @Cual Int )
RETURNS nVarChar(Max)
AS BEGIN
Declare @Resu nVarChar(Max)
Set @Resu = ''
If @Cual <= 0 Return @Resu
Set @Resu = dbo.Convi_FindNum(@Cual)
Declare @TmpPre Int
Set @TmpPre = 0
Declare @TmpSuf Int
Set @TmpSuf = @Cual
Declare @i Int
Declare @TmpNum nVarChar(Max)
Set @i = Case
When CharIndex('###',@Resu) > 0 Then 3
When CharIndex('##',@Resu) > 0 Then 2
When CharIndex('#',@Resu) > 0 Then 1
Else 0
End
If @i > 0 Begin
Set @TmpNum = Convert(nVarChar(Max),@Cual)
Set @TmpPre = Convert(Int,Left(@TmpNum,@i))
Set @Resu = Right(@Resu,Len(@Resu)-@i)
Set @TmpSuf = Convert(Int,Right(@TmpNum,Len(@TmpNum)-@i))
End
If CharIndex('*',@Resu) > 0 Begin
If @TmpPre > 0
Set @Resu = dbo.Convi_PreConvierte(@TmpPre) + Left(@Resu,Len(@Resu)-1) + dbo.Convi_PreConvierte(@TmpSuf)
Else Begin
Set @TmpNum = Convert(nVarChar(Max),@TmpSuf)
Set @TmpSuf = Convert(Int,Right(@TmpNum,Len(@TmpNum)-1))
Set @Resu = Left(@Resu,Len(@Resu)-1) + dbo.Convi_PreConvierte(@TmpSuf)
End
End Else
If @TmpPre > 0
Set @Resu = dbo.Convi_PreConvierte(@TmpPre) + @Resu
RETURN @Resu
END
3.
CREATE FUNCTION Convi_Convierte
( @Cual Int )
RETURNS nVarChar(Max)
AS BEGIN
Declare @Resu nVarChar(Max)
Set @Resu = dbo.Convi_PreConvierte(@Cual)
If Right(@Resu,4) = 'uno'
Set @Resu = Left(@Resu,Len(@Resu)-4) + 'uno'
Set @Resu = Replace(@Resu,'uno','un')
RETURN @Resu
END
4.
CREATE FUNCTION Convi_EnLetras
( @Cual Float )
RETURNS nVarChar(Max)
AS BEGIN
Declare @TmpFloat Float
Set @TmpFloat = Round(@Cual,2)
Declare @Decs nVarChar(Max)
Set @Decs = Right('00' + Convert(nVarChar(Max),Round((@TmpFloat - Floor(@TmpFloat))*100,0)),2)
Declare @Resu nVarChar(Max)
Set @Resu = dbo.Convi_Convierte(Floor(@TmpFloat)) + ' con ' + @Decs + '/100'
RETURN @Resu
END
Al ejecutar estas funciones en un Enterprise Manager de sql server estas se generan en la base de datos en la que las ejecutamos, y asi nos da la posibilidad de ejecutarlas de la siguiente manera:
select dbo.Convi_convierte(9146654)
select dbo.Convi_EnLetras(94.57845)
Con los siguientes resultados:
nueve millones ciento cuarenta y seis mil seiscientos cincuenta y cuatro
noventa y cuatro con 58/100
1.
CREATE FUNCTION Convi_FindNum( @Cual Int )
RETURNS nVarChar(Max)
AS BEGIN
Declare @Resu nVarChar(Max)
Set @Resu = Case @Cual
When 1 Then 'uno'
When 2 Then 'dos'
When 3 Then 'tres'
When 4 Then 'cuatro'
When 5 Then 'cinco'
When 6 Then 'seis'
When 7 Then 'siete'
When 8 Then 'ocho'
When 9 Then 'nueve'
When 10 Then 'diez'
When 11 Then 'once'
When 12 Then 'doce'
When 13 Then 'trece'
When 14 Then 'catorce'
When 15 Then 'quince'
When 16 Then 'dieciseis'
When 17 Then 'diecisiete'
When 18 Then 'dieciocho'
When 19 Then 'diecinueve'
When 20 Then 'veinte'
When 30 Then 'treinta'
When 40 Then 'cuarenta'
When 50 Then 'cincuenta'
When 60 Then 'sesenta'
When 70 Then 'setenta'
When 80 Then 'ochenta'
When 90 Then 'noventa'
When 100 Then 'cien'
Else Case
When @Cual <= 29 Then 'veinti*'
When @Cual <= 39 Then 'treinta y *'
When @Cual <= 49 Then 'cuarenta y *'
When @Cual <= 59 Then 'cincuenta y *'
When @Cual <= 69 Then 'sesenta y *'
When @Cual <= 79 Then 'setenta y *'
When @Cual <= 89 Then 'ochenta y *'
When @Cual <= 99 Then 'noventa y *'
When @Cual <= 199 Then 'ciento *'
When @Cual <= 299 Then 'doscientos *'
When @Cual <= 399 Then 'trescientos *'
When @Cual <= 499 Then 'cuatrocientos *'
When @Cual <= 599 Then 'quinientos *'
When @Cual <= 699 Then 'seiscientos *'
When @Cual <= 799 Then 'setecientos *'
When @Cual <= 899 Then 'ochocientos *'
When @Cual <= 999 Then 'novecientos *'
When @Cual <= 1999 Then 'un mil *'
When @Cual <= 9999 Then '# mil *'
When @Cual <= 99999 Then '## mil *'
When @Cual <= 999999 Then '### mil *'
When @Cual <= 1999999 Then 'un millón *'
When @Cual <= 9999999 Then '# millones *'
When @Cual <= 99999999 Then '## millones *'
When @Cual <= 999999999 Then '### millones *'
When @Cual <= 999999999 Then '### millones *'
Else ''
End
End
RETURN @Resu
END
2.
CREATE FUNCTION Convi_PreConvierte
( @Cual Int )
RETURNS nVarChar(Max)
AS BEGIN
Declare @Resu nVarChar(Max)
Set @Resu = ''
If @Cual <= 0 Return @Resu
Set @Resu = dbo.Convi_FindNum(@Cual)
Declare @TmpPre Int
Set @TmpPre = 0
Declare @TmpSuf Int
Set @TmpSuf = @Cual
Declare @i Int
Declare @TmpNum nVarChar(Max)
Set @i = Case
When CharIndex('###',@Resu) > 0 Then 3
When CharIndex('##',@Resu) > 0 Then 2
When CharIndex('#',@Resu) > 0 Then 1
Else 0
End
If @i > 0 Begin
Set @TmpNum = Convert(nVarChar(Max),@Cual)
Set @TmpPre = Convert(Int,Left(@TmpNum,@i))
Set @Resu = Right(@Resu,Len(@Resu)-@i)
Set @TmpSuf = Convert(Int,Right(@TmpNum,Len(@TmpNum)-@i))
End
If CharIndex('*',@Resu) > 0 Begin
If @TmpPre > 0
Set @Resu = dbo.Convi_PreConvierte(@TmpPre) + Left(@Resu,Len(@Resu)-1) + dbo.Convi_PreConvierte(@TmpSuf)
Else Begin
Set @TmpNum = Convert(nVarChar(Max),@TmpSuf)
Set @TmpSuf = Convert(Int,Right(@TmpNum,Len(@TmpNum)-1))
Set @Resu = Left(@Resu,Len(@Resu)-1) + dbo.Convi_PreConvierte(@TmpSuf)
End
End Else
If @TmpPre > 0
Set @Resu = dbo.Convi_PreConvierte(@TmpPre) + @Resu
RETURN @Resu
END
3.
CREATE FUNCTION Convi_Convierte
( @Cual Int )
RETURNS nVarChar(Max)
AS BEGIN
Declare @Resu nVarChar(Max)
Set @Resu = dbo.Convi_PreConvierte(@Cual)
If Right(@Resu,4) = 'uno'
Set @Resu = Left(@Resu,Len(@Resu)-4) + 'uno'
Set @Resu = Replace(@Resu,'uno','un')
RETURN @Resu
END
4.
CREATE FUNCTION Convi_EnLetras
( @Cual Float )
RETURNS nVarChar(Max)
AS BEGIN
Declare @TmpFloat Float
Set @TmpFloat = Round(@Cual,2)
Declare @Decs nVarChar(Max)
Set @Decs = Right('00' + Convert(nVarChar(Max),Round((@TmpFloat - Floor(@TmpFloat))*100,0)),2)
Declare @Resu nVarChar(Max)
Set @Resu = dbo.Convi_Convierte(Floor(@TmpFloat)) + ' con ' + @Decs + '/100'
RETURN @Resu
END
Al ejecutar estas funciones en un Enterprise Manager de sql server estas se generan en la base de datos en la que las ejecutamos, y asi nos da la posibilidad de ejecutarlas de la siguiente manera:
select dbo.Convi_convierte(9146654)
select dbo.Convi_EnLetras(94.57845)
Con los siguientes resultados:
nueve millones ciento cuarenta y seis mil seiscientos cincuenta y cuatro
noventa y cuatro con 58/100
jueves, 11 de noviembre de 2010
Relacion de tablas de sistema a vistas sql server
http://msdn.microsoft.com/es-es/library/ms187997%28v=SQL.90%29.aspx
miércoles, 8 de septiembre de 2010
jueves, 29 de abril de 2010
recuperar una base desde MDF
http://smart-generator.com/cursos/post/2009/08/Como-rescatar-de-las-llamas-del-infierno-un-MDF-sin-el-LDF.aspx
Qué hacer si ya valió?
Cabe mencionar que la siguiente alternativa solo funciona para SQL Server y no es una opción muy “elegante” al problema, yo sigo la siguiente filosofía: “A problemas piñatas, soluciones piñatas”, no por algo tengo un diploma a las “marranadas” (hablando de soluciones tecnológicas).
La solución propuesta sería:
1. Crear las bases de datos afectadas en blanco, detener el servicio de SQL Server y cambiar el MDF por el que rescataron del server caído (Q.E.P.D).
2. Eliminar el LDF que se generó en blanco y reiniciar el servicio de SQL. Dado esto debería marcar la base de datos como suspect.
3. Posicionarse en la base de datos MASTER (USE MASTER)
4. Cambiar las opciones de configuración global del servidor actual para que permita hacer cambios al mismo.
EXEC sp_Configure 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE
5. Cambiar el estado de la base de datos a MODO DE EMERGENCIA.
UPDATE SYSDATABASES SET STATUS = 32768 WHERE NAME = 'NombreBaseDeDatos'
6. Cambiar las opciones de configuración global del servidor actual para que ya no permita hacer cambios al mismo
EXEC sp_Configure 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE
7. Cambiar la base de datos afectada a opción de usuario simple.
EXEC sp_DBOption 'ArchivoIntegracion', 'SINGLE USER', 'TRUE'
8. Reconstruir el LOG de transacciones (LDF) de la base de datos (MDF).
DBCC REBUILD_LOG ('NombreBaseDeDatos', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\NombreBaseDeDatos_Log.ldf')
9. Cambiar las opciones de configuración global del servidor actual para que permita hacer cambios al mismo.
EXEC sp_Configure 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE
10. Cambiar el estado de la base de datos a MODO NORMAL.
UPDATE SYSDATABASES SET STATUS = 0 WHERE NAME = 'NombreBaseDeDatos'
11. Cambiar las opciones de configuración global del servidor actual para que ya no permita hacer cambios al mismo
EXEC sp_Configure 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE
12. Cambiar la base de datos afectada a opción de usuarios múltiples.
EXEC sp_dboption 'ArchivoIntegracion', 'SINGLE USER', 'FALSE'
Y voila, ya quedó milagrosamente rescatado nuestro MDF sin necesidad de contar con el LDF respectivo. Josué ya puede estar más tranquilo al respecto y tener más cuidado para la próxima vez que ocurra esto en su organización (que esperemos y jamás vuelva a suceder).
Qué hacer si ya valió?
Cabe mencionar que la siguiente alternativa solo funciona para SQL Server y no es una opción muy “elegante” al problema, yo sigo la siguiente filosofía: “A problemas piñatas, soluciones piñatas”, no por algo tengo un diploma a las “marranadas” (hablando de soluciones tecnológicas).
La solución propuesta sería:
1. Crear las bases de datos afectadas en blanco, detener el servicio de SQL Server y cambiar el MDF por el que rescataron del server caído (Q.E.P.D).
2. Eliminar el LDF que se generó en blanco y reiniciar el servicio de SQL. Dado esto debería marcar la base de datos como suspect.
3. Posicionarse en la base de datos MASTER (USE MASTER)
4. Cambiar las opciones de configuración global del servidor actual para que permita hacer cambios al mismo.
EXEC sp_Configure 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE
5. Cambiar el estado de la base de datos a MODO DE EMERGENCIA.
UPDATE SYSDATABASES SET STATUS = 32768 WHERE NAME = 'NombreBaseDeDatos'
6. Cambiar las opciones de configuración global del servidor actual para que ya no permita hacer cambios al mismo
EXEC sp_Configure 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE
7. Cambiar la base de datos afectada a opción de usuario simple.
EXEC sp_DBOption 'ArchivoIntegracion', 'SINGLE USER', 'TRUE'
8. Reconstruir el LOG de transacciones (LDF) de la base de datos (MDF).
DBCC REBUILD_LOG ('NombreBaseDeDatos', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\NombreBaseDeDatos_Log.ldf')
9. Cambiar las opciones de configuración global del servidor actual para que permita hacer cambios al mismo.
EXEC sp_Configure 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE
10. Cambiar el estado de la base de datos a MODO NORMAL.
UPDATE SYSDATABASES SET STATUS = 0 WHERE NAME = 'NombreBaseDeDatos'
11. Cambiar las opciones de configuración global del servidor actual para que ya no permita hacer cambios al mismo
EXEC sp_Configure 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE
12. Cambiar la base de datos afectada a opción de usuarios múltiples.
EXEC sp_dboption 'ArchivoIntegracion', 'SINGLE USER', 'FALSE'
Y voila, ya quedó milagrosamente rescatado nuestro MDF sin necesidad de contar con el LDF respectivo. Josué ya puede estar más tranquilo al respecto y tener más cuidado para la próxima vez que ocurra esto en su organización (que esperemos y jamás vuelva a suceder).
miércoles, 13 de enero de 2010
Guardar archivos en Base de datos SQL Server
http://www.picacodigos.com/CommentView,guid,0a921d29-8810-49f8-90e2-98d4659a651b.aspx
domingo, 3 de enero de 2010
Mejorar el rendimiento de sql server
he aqui los vinculos que indican las opciones a deshabilitar y lo relacionado con los archivos ndf
http://msdn.microsoft.com/es-es/library/ms179316.aspx
http://consejosdelguru.blogspot.com/2007/10/mejorar-rendimiento-de-sql-server-2000.html
http://msdn.microsoft.com/es-es/library/ms179316.aspx
http://consejosdelguru.blogspot.com/2007/10/mejorar-rendimiento-de-sql-server-2000.html
miércoles, 30 de septiembre de 2009
miércoles, 12 de agosto de 2009
Tutorial para replicar bases de datos SQL server 2005
liga de la MSDN para realizar replicas entre servidores con sql server 2005
lunes, 27 de abril de 2009
cambiar permisos o caracteristicas de usuario sql
sp_change_users_login 'Update_one','web','web'
ALTER USER Mary5 WITH NAME = Mary51;
ALTER USER Mary5 WITH NAME = Mary51;
Suscribirse a:
Entradas (Atom)
