martes, 21 de enero de 2014

Tener el código fuente de nuestros programas con un gestor de código es para cualquier programador esencial y practico.El problema esta cuando queremos lo mismo en nuestro servidor de SQL Server.
Ya existen soluciones como Team Fundation de visual Studio o aplicaciones de empresas que suelen costar entre 300€ y 800 € por licencia lo cual no esta disponible a todo el mundo.
He navegado y buscado una solución fácil y gratuita, pero no he encontrado nunca nada.
Es por ello que he creado mi propio gestor fácil, sencillo y por supuesto gratis.
Para ello lo primero que tenemos que  hacer es ejecutar el siguiente código

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
    OBJECT_ID(N'[dbo].[VERSION_CONTROL]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[VERSION_CONTROL](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Basedatos] [varchar](256) NULL,
    [Tipo] [varchar](50) NULL,
    [ObjetoNombre] [varchar](256) NULL,
    [ObjetoTipo] [varchar](25) NULL,
    [SqlConsulta] [nvarchar](max) NULL,
    [Login] [varchar](256) NULL,
    [Hostname] [varchar](256) NULL,
    [FechaModificacion] [datetime] NULL,
    [Version] [int] NOT NULL,
 CONSTRAINT [PK_VERSION_CONTROL] PRIMARY KEY CLUSTERED
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END

GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [TRG_VERSION_CONTROL]
ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
CREATE_TABLE, ALTER_TABLE, DROP_TABLE,
CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,
CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER,
CREATE_VIEW, ALTER_VIEW, DROP_VIEW,
CREATE_INDEX, ALTER_INDEX, DROP_INDEX

AS

SET NOCOUNT ON

DECLARE @CurrentVersion int
DECLARE @CurrentID int
DECLARE @Basedatos varchar(256)
DECLARE @ObjetoNombre varchar(256)
DECLARE @data XML

SET @data = EVENTDATA()

INSERT INTO dbo.VERSION_CONTROL
    (Basedatos, Tipo,ObjetoNombre, ObjetoTipo, SqlConsulta,
    Login,Hostname,FechaModificacion, Version)
VALUES(
@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'),  -- value is case-sensitive
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'),
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)'),
HOST_NAME(),
GETDATE(),
0
)

SET @CurrentID = IDENT_CURRENT('VERSION_CONTROL')
SELECT @Basedatos = Basedatos, @ObjetoNombre = ObjetoNombre
    FROM VERSION_CONTROL WHERE ID = @CurrentID
IF (@Basedatos IS NOT NULL AND @ObjetoNombre IS NOT NULL)
BEGIN
    SELECT @CurrentVersion = MAX(Version)
    FROM VERSION_CONTROL WHERE Basedatos = @Basedatos
    AND ObjetoNombre = @ObjetoNombre
    UPDATE VERSION_CONTROL SET Version =
    ISNULL(@CurrentVersion, 0) + 1 WHERE ID = @CurrentID
END
GO
ENABLE TRIGGER [TRG_VERSION_CONTROL] ON DATABASE

En este enlace lo puedes descargar.

En este código lo que haremos es crear una tabla llamada Version_Control dentro de la Base Datos que lo ejecutamos y un trigger en cual guardara cualquier cambio que realicemos sobre procedimientos,tablas,vistas, funciones escalares,funciones tabla y trigger.
Cada vez que ejecutemos un cambio, borrado o creación de cualquiera de los objetos, se lanzará el trigger que nos guardara en la tabla los cambios realizados.
Los datos que guardaremos son la base datos afectada, que tipo de operación (ALTER,CREATE...),nombre del objeto afectado,objeto tipo(Procedimiento, función, trigger...),la consulta sql que hemos lanzado, el usuario de la BD que lo lanza, nombre del host,la fecha en la que se lanzo y versión (si se lanza sobre el mismo objeto, este ira aumentando a 1)

De esta manera siempre sabremos que cambios hemos realizado sobre (por ejemplo) los procedimientos que tengamos en SQL Server y que con el tiempo van modificando y guardados en un tabla, evitando configuraciones engorrosas, sistemas complejos o soluciones caras.
Personalmente, me he quitado mucho trabajo, ya que antes tenia que guardar la modificación en un script, añadirlo al Source Safe. Total por lo menos 15 minutos entre encontrar el archivo, desprotegerlo, editarlo, guardarlo y volverlo a proteger, y con el problema añadido que no te equivoques al editar.Ahora el tiempo que tardo es lo que tarda la consulta en ejecutarse (segundos) y me olvido de nada más.

Ademas de esta solución para no estar lanzando consultas y teniendo que escribir mas, he realizado una aplicación en C# a modo del Source Safe, que te permite ver los cambios que se han realizado y comparar visualmente las 2 versiones mostrando los cambios en colores.

Nota: Se han corregido y añadido alguna funcionalidad más, al final del articulo podrás ver los nuevos cambios realizados

Para descargarlo pulsa Aquí

Solo tenemos que pulsar nueva conexión para conectar al servidor, después mostrara un árbol con todos los objeto excepto las tablas que en esta versión no lo he añadido.
Simplemente al pulsar sobre cualquier objeto como un procedimiento, nos mostrara un grid con las distintas versiones, si no se ha modificado el objeto, solo nos saldrá una linea, si por el contrario has modificado mostrará las distintas versiones.


Si existen varias versiones podemos pulsar el botón de historial y mostrara las distintas versiones.Seleccionando varias (2 a la vez solo) y pulsando el botón de comparar


Nos aparecerá la siguiente pantalla


Donde las lineas azules son lineas modificadas, las verdes lineas añadidas y las rojas son las lineas eliminadas.
El botón de sqlManagement, sirve para abrirlo directamente en la conexión actual, con el objeto seleccionado con el código SQL, en el caso de no haber seleccionado ninguno se abrirá sin nada.
Este programa necesita el FrameWork 4.5 ya que esta compilado con Visual Studio 2010.

Espero que os sea de ayuda, y si veis algún fallo, solo tenéis que indicarmelo para arreglarlo

Fix 1.0
- He arreglado un bug (un despiste ....) que hacia que cuando selecciona por primera vez un nodo del árbol, te mostraba el código SQL de la primera version y no de la ultima.
- He añadido un botón para que puedas guardar el texto SQL que tengas actualmente pulsado
- Ahora guarda la ultima conexión correcta que realizaste para no tener que volver a escribirla en caso de que quieras conectarte a la misma de nuevo.




domingo, 12 de enero de 2014

Formatear fechas con sql

Posted by Cuervecillo On 23:45 No comments
Aquí os dejo varias formas de formatear fechas en SQL.

Formatos de Fechas Standard
Formato Fecha Standard Sentencia SQL Resultado
Mon DD YYYY
HH:MIAM (or PM)
Default SELECT CONVERT(VARCHAR(20), GETDATE(), 100) Jan 1 2005 1:29PM
MM/DD/YY USA SELECT CONVERT(VARCHAR(8), GETDATE(), 1) AS [MM/DD/YY] 11/23/98
MM/DD/YYYY USA SELECT CONVERT(VARCHAR(10), GETDATE(), 101) AS [MM/DD/YYYY] 11/23/1998
YY.MM.DD ANSI SELECT CONVERT(VARCHAR(8), GETDATE(), 2) AS [YY.MM.DD] 72.01.01
YYYY.MM.DD ANSI SELECT CONVERT(VARCHAR(10), GETDATE(), 102) AS [YYYY.MM.DD] 1972.01.01
DD/MM/YY British/French SELECT CONVERT(VARCHAR(8), GETDATE(), 3) AS [DD/MM/YY] 19/02/72
DD/MM/YYYY British/French SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS [DD/MM/YYYY] 19/02/1972
DD.MM.YY German SELECT CONVERT(VARCHAR(8), GETDATE(), 4) AS [DD.MM.YY] 25.12.05
DD.MM.YYYY German SELECT CONVERT(VARCHAR(10), GETDATE(), 104) AS [DD.MM.YYYY] 25.12.2005
DD-MM-YY Italian SELECT CONVERT(VARCHAR(8), GETDATE(), 5) AS [DD-MM-YY] 24-01-98
DD-MM-YYYY Italian SELECT CONVERT(VARCHAR(10), GETDATE(), 105) AS [DD-MM-YYYY] 24-01-1998
DD Mon YY - SELECT CONVERT(VARCHAR(9), GETDATE(), 6) AS [DD MON YY] 04 Jul 06
DD Mon YYYY - SELECT CONVERT(VARCHAR(11), GETDATE(), 106) AS [DD MON YYYY] 04 Jul 2006
Mon DD, YY - SELECT CONVERT(VARCHAR(10), GETDATE(), 7) AS [Mon DD, YY] Jan 24, 98
Mon DD, YYYY - SELECT CONVERT(VARCHAR(12), GETDATE(), 107) AS [Mon DD, YYYY] Jan 24, 1998
HH:MM:SS - SELECT CONVERT(VARCHAR(8), GETDATE(), 108) 03:24:53
Mon DD YYYY HH:MI:SS:MMMAM (or PM) Default +
milliseconds
SELECT CONVERT(VARCHAR(26), GETDATE(), 109) Apr 28 2006 12:32:29:253PM
MM-DD-YY USA SELECT CONVERT(VARCHAR(8), GETDATE(), 10) AS [MM-DD-YY] 01-01-06
MM-DD-YYYY USA SELECT CONVERT(VARCHAR(10), GETDATE(), 110) AS [MM-DD-YYYY] 01-01-2006
YY/MM/DD - SELECT CONVERT(VARCHAR(8), GETDATE(), 11) AS [YY/MM/DD] 98/11/23
YYYY/MM/DD - SELECT CONVERT(VARCHAR(10), GETDATE(), 111) AS [YYYY/MM/DD] 1998/11/23
YYMMDD ISO SELECT CONVERT(VARCHAR(6), GETDATE(), 12) AS [YYMMDD] 980124
YYYYMMDD ISO SELECT CONVERT(VARCHAR(8), GETDATE(), 112) AS [YYYYMMDD] 19980124
DD Mon YYYY HH:MM:SS:MMM(24h) Europe default + milliseconds SELECT CONVERT(VARCHAR(24), GETDATE(), 113) 28 Apr 2006 00:34:55:190
HH:MI:SS:MMM(24H) - SELECT CONVERT(VARCHAR(12), GETDATE(), 114) AS [HH:MI:SS:MMM(24H)] 11:34:23:013
YYYY-MM-DD HH:MI:SS(24h) ODBC Canonical SELECT CONVERT(VARCHAR(19), GETDATE(), 120) 1972-01-01 13:42:24
YYYY-MM-DD HH:MI:SS.MMM(24h) ODBC Canonical
(with milliseconds)
SELECT CONVERT(VARCHAR(23), GETDATE(), 121) 1972-02-19 06:35:24.489
YYYY-MM-DDTHH:MM:SS:MMM ISO8601 SELECT CONVERT(VARCHAR(23), GETDATE(), 126) 1998-11-23T11:25:43:250
DD Mon YYYY HH:MI:SS:MMMAM Kuwaiti SELECT CONVERT(VARCHAR(26), GETDATE(), 130) 28 Apr 2006 12:39:32:429AM
DD/MM/YYYY HH:MI:SS:MMMAM Kuwaiti SELECT CONVERT(VARCHAR(25), GETDATE(), 131) 28/04/2006 12:39:32:429AM
Mas formatos de Fechas que no vienen con el standard de SQL, para ello usaremos la función CONVERT function.
Formato extendido de Fechas
Formato Fecha Sentencia SQL Resultado
YY-MM-DD
SELECT SUBSTRING(CONVERT(VARCHAR(10), GETDATE(), 120), 3, 8) AS [YY-MM-DD]
SELECT REPLACE(CONVERT(VARCHAR(8), GETDATE(), 11), '/', '-') AS [YY-MM-DD]
99-01-24
YYYY-MM-DD
SELECT CONVERT(VARCHAR(10), GETDATE(), 120) AS [YYYY-MM-DD]
SELECT REPLACE(CONVERT(VARCHAR(10), GETDATE(), 111), '/', '-') AS [YYYY-MM-DD]
1999-01-24
MM/YY SELECT RIGHT(CONVERT(VARCHAR(8), GETDATE(), 3), 5) AS [MM/YY]
SELECT SUBSTRING(CONVERT(VARCHAR(8), GETDATE(), 3), 4, 5) AS [MM/YY]
08/99
MM/YYYY SELECT RIGHT(CONVERT(VARCHAR(10), GETDATE(), 103), 7) AS [MM/YYYY] 12/2005
YY/MM SELECT CONVERT(VARCHAR(5), GETDATE(), 11) AS [YY/MM] 99/08
YYYY/MM SELECT CONVERT(VARCHAR(7), GETDATE(), 111) AS [YYYY/MM] 2005/12
Month DD, YYYY SELECT DATENAME(MM, GETDATE()) + RIGHT(CONVERT(VARCHAR(12), GETDATE(), 107), 9) AS [Month DD, YYYY] July 04, 2006
Mon YYYY SELECT SUBSTRING(CONVERT(VARCHAR(11), GETDATE(), 113), 4, 8) AS [Mon YYYY] Apr 2006
Month YYYY SELECT DATENAME(MM, GETDATE()) + ' ' + CAST(YEAR(GETDATE()) AS VARCHAR(4)) AS [Month YYYY] February 2006
DD Month SELECT CAST(DAY(GETDATE()) AS VARCHAR(2)) + ' ' + DATENAME(MM, GETDATE()) AS [DD Month] 11 September
Month DD SELECT DATENAME(MM, GETDATE()) + ' ' + CAST(DAY(GETDATE()) AS VARCHAR(2)) AS [Month DD] September 11
DD Month YY SELECT CAST(DAY(GETDATE()) AS VARCHAR(2)) + ' ' + DATENAME(MM, GETDATE()) + ' ' + RIGHT(CAST(YEAR(GETDATE()) AS VARCHAR(4)), 2) AS [DD Month YY] 19 February 72
DD Month YYYY SELECT CAST(DAY(GETDATE()) AS VARCHAR(2)) + ' ' + DATENAME(MM, GETDATE()) + ' ' + CAST(YEAR(GETDATE()) AS VARCHAR(4)) AS [DD Month YYYY] 11 September 2002
MM-YY SELECT RIGHT(CONVERT(VARCHAR(8), GETDATE(), 5), 5) AS [MM-YY]
SELECT SUBSTRING(CONVERT(VARCHAR(8), GETDATE(), 5), 4, 5) AS [MM-YY]
12/92
MM-YYYY SELECT RIGHT(CONVERT(VARCHAR(10), GETDATE(), 105), 7) AS [MM-YYYY] 05-2006
YY-MM SELECT RIGHT(CONVERT(VARCHAR(7), GETDATE(), 120), 5) AS [YY-MM]
SELECT SUBSTRING(CONVERT(VARCHAR(10), GETDATE(), 120), 3, 5) AS [YY-MM]
92/12
YYYY-MM SELECT CONVERT(VARCHAR(7), GETDATE(), 120) AS [YYYY-MM] 2006-05
MMDDYY SELECT REPLACE(CONVERT(VARCHAR(10), GETDATE(), 1), '/', '') AS [MMDDYY] 122506
MMDDYYYY SELECT REPLACE(CONVERT(VARCHAR(10), GETDATE(), 101), '/', '') AS [MMDDYYYY] 12252006
DDMMYY SELECT REPLACE(CONVERT(VARCHAR(10), GETDATE(), 3), '/', '') AS [DDMMYY] 240702
DDMMYYYY SELECT REPLACE(CONVERT(VARCHAR(10), GETDATE(), 103), '/', '') AS [DDMMYYYY] 24072002
Mon-YY SELECT REPLACE(RIGHT(CONVERT(VARCHAR(9), GETDATE(), 6), 6), ' ', '-') AS [Mon-YY] Sep-02
Mon-YYYY SELECT REPLACE(RIGHT(CONVERT(VARCHAR(11), GETDATE(), 106), 8), ' ', '-') AS [Mon-YYYY] Sep-2002
DD-Mon-YY SELECT REPLACE(CONVERT(VARCHAR(9), GETDATE(), 6), ' ', '-') AS [DD-Mon-YY] 25-Dec-05
DD-Mon-YYYY SELECT REPLACE(CONVERT(VARCHAR(11), GETDATE(), 106), ' ', '-') AS [DD-Mon-YYYY] 25-Dec-2005

Recursos Web Utiles

Posted by Cuervecillo On 23:43 No comments
Aquí os dejo direcciones a recursos que he ido recopilando y que me han sido de gran utilidad

Programación

http://www.codeproject.com/ 
Portal Web de programación con ejemplos, foros, artículos, comunidades y gran cantidad de lenguajes.
Muy recomendable y de gran utilidad, sobre todo en temas de visual Studio y C#

http://stackoverflow.com/
Uno de los mejores foros que me he encontrado, casi todo lo que he buscado lo he encontrado en esta página.

Web
http://www.w3schools.com/
No te acuerdas cual es el atributo de ancho en css, o cual es la funcion en javascript para pasar a entero una cadena, aqui tienes todas las referencias de para el desarrollo Web.

Utilidades

http://www.diffnow.com/
Si no tienes el Source Safe y necesitas compara 2 texto para ver las diferencias, esta pagina te permitirá ver las diferencias entre ambos y en que lineas se encuentran

http://www.comparemyfiles.com/default.aspx
Misma herramienta que la pagina anterior pero para archivos, seleccionamos los archivos de nuestro PC y comprueba las diferencias

http://gskinner.com/RegExr/
No te acuerdas cual era la cadena de una expresion regular para formatear un teléfono, no hay problema, en esta pagina, podrás probar, generar las expresiones regulares, ademas puedes ver cual es la expresión regular de miles de formatos creados por los usuario y compartidos para el resto.

Iconos

https://www.iconfinder.com/
Miles de iconos para nuestras aplicaciones con un aspecto profesional y gratuitos.Hay cientos de temas para los distintos iconos, formatos, tamaños....

viernes, 10 de enero de 2014

Este articulo voy a explicar como de una consulta normal podemos obtener el mismo resultado pero transformando las filas por columna.
Para ello la tabla a transformar debe cumplir los siguientes requisitos:
- La tabla a original debe tener un identificador único.
- La tabla original solo puede tener 2 columnas, a ser posible una cadena y un valor numérico.

En mi caso voy a utilizar una tabla simple que se llama 'Prueba' con 3 columnas,la primera es el identificador unico 'Id', la segunda columna es 'Nombre' del tipo varchar, y la tercera se llama 'Valor' del tipo int.

El resultado de un SELECT * FROM Prueba es el siguiente
Primero debemos guardar el resultado del la tabla a transformar en una tabla Temporal de esta manera

SELECT P.Id Id_Registro,'[' +P.Nombre+ ']' NombreCampo ,P.Valor Valor
INTO #TablaTransformada
FROM Prueba P

Después creamos 2 variables para asignarles valor dentro de un SELECT, la primera guardara un texto que sera una consulta en texto plano del tipo 'ALTER TABLE #Resultado ADD' la cual va a añadir como nombre de columna los valores del campo 'NombreCampo'.
La segunda tiene la misma funcionalidad pero para guardar un UPDATE con el valor del campo 'Valor'.

DECLARE @SqlAlter VARCHAR(MAX), @SqlUpdate VARCHAR(MAX)
SET @SqlAlter = 'ALTER TABLE #Resultado ADD '
SET @SqlUpdate = ''
SELECT @SqlAlter = @SqlAlter + NombreCampo + ' varchar(250),'
, @SqlUpdate = @SqlUpdate + 'UPDATE #Resultado SET ' + NombreCampo + ' = LEFT(CV.Valor, 250) FROM #TablaTransformada CV INNER JOIN #Resultado R ON CV.Id_Registro = R.Id WHERE CV.NombreCampo = ''' + NombreCampo + '''' + CHAR(10) + CHAR(13)
FROM #TablaTransformada DC
WHERE NombreCampo IS NOT NULL
GROUP BY NombreCampo
ORDER BY NombreCampo

La consulta anterior lo que hace es generar este codigo plano dinamicamente para luego lanzarlo con un EXEC

ALTER TABLE #Resultado ADD [Mesa] varchar(250),[Puerta] varchar(250),[Silla] varchar(250),[Sillon] varchar(250),

-UPDATE #Resultado SET [Mesa¡] = LEFT(CV.Valor, 250) FROM #TablaTransformada CV 
INNER JOIN #Resultado R ON CV.Id_Registro = R.Id WHERE CV.NombreCampo = '[Mesa]'

-UPDATE #Resultado SET [Puerta] = LEFT(CV.Valor, 250) FROM #TablaTransformada CV
 INNER JOIN #Resultado R ON CV.Id_Registro = R.Id WHERE CV.NombreCampo = '[Puerta]'

-UPDATE #Resultado SET [Silla] = LEFT(CV.Valor, 250) FROM #TablaTransformada CV
 INNER JOIN #Resultado R ON CV.Id_Registro = R.Id WHERE CV.NombreCampo = '[Silla]'

-UPDATE #Resultado SET [Sillon] = LEFT(CV.Valor, 250) FROM #TablaTransformada CV 
INNER JOIN #Resultado R ON CV.Id_Registro = R.Id WHERE CV.NombreCampo = '[Sillon]'

Si te das cuenta que al final de la consulta alter hay una ',' que si no se quita el sql al ejecutarlo mostraría un error, por ello mas adelante lo eliminaremos.
Ademas tenemos que tener en cuenta, que para el proceso funcione para cualquier tipo datos, se realiza una conversión tanto de la columna 'NombreCampo' así como 'Valor' al tipo VARCHAR(250), ademas de agrupar por 'NombreCampo', para que tenga en cuenta que dentro del campo 'NombreCampo'
pueden existir 2 registros con el mismo valor.

Ya para finalizar debemos crear la tabla temporal #Resultado y lanzar las variables declaradas con un simple EXEC e insertamos dentro de la tabla  #Resultado como han quedado los resultados

CREATE TABLE #Resultado (Id INT)
IF @SqlUpdate <> '' 
BEGIN
   SET @SqlAlter = LEFT(@SqlAlter, LEN(@SqlAlter) -1) -- Quitamos la última coma de @SqlAlter
   EXEC (@SqlAlter)
   INSERT INTO #Resultado(Id) SELECT DISTINCT Id_Registro FROM #TablaTransformada
   EXEC (@SqlUpdate)
END

Si hacemos SELECT  * FROM #Resultado el resultado es el siguiente
No olvides borrar las tablas temporales cuando no las tengas que utilizar mas para liberar memoria y que no produzca un error al volver a ejecutar el procedimiento.

DROP TABLE #TablaTransformada
DROP TABLE #Resultado

Espero que os sirva para algo este articulo.

El código completo seria:

SELECT P.Id Id_Registro,'[' +P.Nombre+ ']' NombreCampo ,P.Valor 
INTO #TablaTransformada
FROM Prueba P

DECLARE @SqlAlter VARCHAR(MAX), @SqlUpdate VARCHAR(MAX)
SET @SqlAlter = 'ALTER TABLE #Resultado ADD '
SET @SqlUpdate = ''
SELECT @SqlAlter = @SqlAlter + NombreCampo + ' varchar(250),', @SqlUpdate = @SqlUpdate + 'UPDATE #Resultado SET ' + NombreCampo + ' = LEFT(CV.Valor, 250) FROM #TablaTransformada CV INNER JOIN #Resultado R ON CV.Id_Registro = R.Id WHERE CV.NombreCampo = ''' + NombreCampo + '''' + CHAR(10) + CHAR(13)
FROM #TablaTransformada DC
WHERE NombreCampo IS NOT NULL
GROUP BY NombreCampo
ORDER BY NombreCampo

CREATE TABLE #Resultado (Id INT)
IF @SqlUpdate <> ''
BEGIN
SET @SqlAlter = LEFT(@SqlAlter, LEN(@SqlAlter) -1)-- Quitamos la última coma de la variable @SqlAlter.
EXEC (@SqlAlter)
INSERT INTO #Resultado(Id) SELECT DISTINCT Id_Registro FROM #TablaTransformada
EXEC (@SqlUpdate)
END

SELECT  *
FROM    #Resultado

DROP TABLE #TablaTransformada
DROP TABLE #Resultado

domingo, 5 de enero de 2014

NotePad++

Posted by Cuervecillo On 14:24 No comments
Cansado del block de notas como yo, entonces aquí tienes el mejor editor de texto gratuito y potente del mundo, el NotePad++.

Las principales características que tiene son:

Coloreado y envoltura de sintaxis: si se escribe en un lenguaje de programación o marcado, Notepad++ es capaz de resaltar las expresiones propias de la sintaxis de ese lenguaje para facilitar su lectura.
Pestañas: al igual que en muchos navegadores, se pueden abrir varios documentos y organizarlos en pestañas.
Resaltado de paréntesis e indentación: cuando el usuario coloca el cursor en un paréntesis, Notepad++ resalta éste y el paréntesis correspondiente de cierre o apertura. También funciona con corchetes y llaves
Grabación y reproducción de macros.
Soporte de extensiones: incluye algunas por defecto.

Lenguajes que soporta:
  • Ada
  • ASP
  • ASM Ensamblador (x86)
  • ASM Ensamblador (Z80)
  • AutoIt
  • Batch
  • C
  • C#
  • C++
  • Caml
  • CMake
  • COBOL
  • CSS
  • D
  • Diff
  • Flash ActionScript
  • Fortran
  • Gui4Cli
  • Haskell
  • HTML
  • INNO
  • Java
  • JavaScript
  • JSP
  • KiXtart
  • Lisp
  • Lua
  • Makefile
  • MATLAB
  • MS INI (archivo)
  • NSIS
  • Objective-C
  • Pascal
  • Perl
  • PHP
  • PostScript
  • PowerShell
  • Properties
  • Python
  • R
  • RC (fichero de recurso)
  • Ruby
  • Shell
  • Scheme
  • Smalltalk
  • SQL
  • Tcl
  • TeX
  • VB
  • VHDL
  • Verilog
  • XML
  • YAML
y muchas mas utilidades, muy recomendable.....

Aquí te dejo el enlace

Brace Completer

Posted by Cuervecillo On 14:06 No comments
Brace Completer es una de las utilidades que tengo, y permite abrir y cerrar corchete solo pulsando Enter.
Ya no tendrás que escribir 2 corchetes cada vez que escribas por ejemplo un IF o un ELSE, etc...
Es muy útil y no tienes que configurar nada, solo instalarlo..


Aquí os dejo el enlace



Visual Studio Gallery

Posted by Cuervecillo On 13:11 No comments
Visual Studio Gallery es la meca de las utilidades para Visual Studio.
Aquí encontraras miles de utilidades para configurar tu Visual Studio y sacar el máximo provecho de el.
En el ademas de Adding para Visual Studio, hay proyectos de ejemplo para casi todos las versiones de Visual Studio, lenguajes (C#,J#,Visual Basic...), documentación oficial, foro....

Te recomiendo que lo visites , tenerlo en tu bookmark ya que es de gran ayuda....

Aquí te dejo el enlace

Site search