[SQL 2008] Insertar múltiples filas con valores (Nuevo).

31 03 2009

Hola amigos, probablemente alguna vez tratamos de insertar múltiples filas en una tabla, y lo hacíamos repitiendo el comando INSERT (copiando y pegando) y solo cambiando el valor de las columnas. En SQL 2008 se puede hacer una múltiple inserción solo escribiendo una vez el INSERT <TABLE> y separando por comas los grupos de valores a insertar, les dejo el ejemplo, que en lo personal se me hace muy práctico e interesante.

1. Creamos una tabla “PRB_USUARIOS” .

CREATE TABLE dbo.PRB_USUARIOS
(Nombre VARCHAR(40),
 Apellidos VARCHAR(40))
GO

2. Insertamos múltiples filas (Observe la sintaxis).

--Insertando múltiples filas con valores.
INSERT dbo.PRB_USUARIOS
VALUES  ('Ivan','Rangel'),
        ('Cruz','Treviño'),
        ('Pepe','El toro'),
        ('María','Félix'),
        ('Mario','Cantinflas'),
        ('Pedro','Infante')

Observe que en el comando INSERT:

a. No aparece INTO, ya no es necesario en SQL 2008 (es opcional).

b. No se repite INSERT, solo se escribe una vez al igual que VALUES.

c. Por cada conjunto de valores a insertar tiene que separarlos por coma.

3. Ahora seleccionamos los datos insertados.

SELECT * FROM dbo.PRB_USUARIOS 

image

Me despido y espero les sea de ayuda, dejen comentarios.

Etiquetas de Technorati: ,,




[SQL 2008] Actualización de columnas con tipo de valor largo.

27 03 2009

Saludos, me encontré con una nueva funcionalidad en SQL 2008, esta es la implementación del comando UPDATE con la clausula .WRITE, para tipo de datos con VALOR-LARGO, Cabe mencionar que la inserción de tipos de datos de valor-largo es la misma que en otras versiones de SQL server; Ahora SQL Server 2008 para la actualización de estos tipos de datos incluye el método .WRITE.

Sintaxis:

UPDATE <table_or_view_name>
SET column_name = .WRITE ( expression , @Offset , @Length )
FROM <table_source>
WHERE <search_condition>

Parámetros del método .WRITE:

Argumento

Descripción

expresión

La expresión define el fragmento de texto que se coloca en la columna.

@offset

@Offset determina la posición inicial de los datos existentes en donde el nuevo texto debe ser colocado. Si @Offset es NULL, significa que la nueva expresión se añadirá al final de la columna (omitiendo también el segundo parámetro @length).

@length

@length determina la longitud de la sección de la superposición.

Para que esto quede claro crearemos una tabla la cual tenga un campo de tipo de valor-largo y posteriormente actualizaremos el valor.

1. Creando la tabla:

CREATE TABLE dbo.PRB_Articulo
(ArticuloID INT NOT NULL,
 Contenido VARCHAR(MAX) NOT NULL)
GO

2. Insertando un valor:

INSERT dbo.PRB_Articulo (ArticuloID, Contenido)
VALUES (1, 'El sqlPsyKrest Blog, Es un blog de apoyo a las personas interesadas en
el aprendizaje de SQL con el fin de aumentar y compartir los conocimientos
con todos ustedes, atte. su amigo autor.' )
GO

3.Seleccionamos este primer valor del campo “Contenido”:

image

4. Actualicemos agregando más texto al final del campo “Contenido”  utilizando el método .WRITE:

UPDATE dbo.PRB_Articulo
SET Contenido .WRITE (' Como ven ahora podemos agregar más lineas a nuestros textos largos con una simple
actualización, interesante ¿no creen?',
NULL, NULL)
WHERE ArticuloID = 1
GO

5. Seleccionamos el campo “Contenido” y veamos que la parte marcada en amarillo es la que se actualizo y se añadió al final del texto.

image

6. Ahora vamos a reemplazar la palabra autor la cual esta en el texto de la columna “Contenido”, se sustituirá por mi nombre: Iván Rangel Cuadros.

UPDATE dbo.PRB_Articulo
SET Contenido .WRITE('Iván Rangel Cuadros', 182, 5)
WHERE ArticuloID = 1
GO

7. Mostramos el resultado final de la sustitución por medio de la actualización con el método .WRITE.

image

Espero les sea de ayuda, dejen comentarios.





[SQL 2008] Crear una lista delimitada por comas usando SELECT.

26 03 2009

Saludos amigos, una ventaja de SQL 2008 es que nos permite hacer el uso de una sobrecarga del operador “=”, para poder asignar múltiples valores a una variable TSQL  como:

SELECT @Var = @Var

La instrucción anterior en SQL 2005 no marca error pero solo nos guarda el ultimo valor asignado. Les dejo un ejemplo que aseguro que a muchos nos será de gran utilidad.

Ha!!! se me olvidaba que en SQL 2008 podemos asignar un valor directo a una variable cuando la declaramos ahorrándonos el SET.

DECLARE @txt AS VARCHAR(250) = ”

También es necesario mencionar que inicializamos la variable con un valor vacío ya que no es correcto concatenar valores NULL a una cadena.

1. Creamos la tabla de ejemplo.

CREATE TABLE dbo.PRB_USUARIOS
(Nombre VARCHAR(40),
Apellidos VARCHAR(40))
GO

2. Insertamos algunos datos.

INSERT INTO dbo.PRB_USUARIOS VALUES ('Ivan','Rangel')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Claudia','Perez')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Maria','Cuadros')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Mariana','Rangel')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Mario','Cantinflas')
INSERT INTO dbo.PRB_USUARIOS VALUES ('Pedro','Infante')
GO

3. Ejecutamos la consulta de concatenación (Muy fácil :) ).

DECLARE @txt AS VARCHAR(250) = ''
SELECT @txt = @txt + Nombre + ' ' + Apellidos + ', ' FROM dbo.PRB_USUARIOS  
SELECT @txt AS txtConcatenado 
GO

Y nos da el siguiente resultado.

image 

Espero les sea de ayuda, dejen comentarios!!!.





[SQL(2005/2008)-UNPIVOT] Normalización de Datos con UNPIVOT.

26 03 2009

Saludos nuevamente amigos, leyendo nuevamente sobre TSQL, me encontré el tema de Normalización de datos con la clausula UNPIVOT.

El comando UNPIVOT hace lo contrario de PIVOT cambiando columnas en filas, utilizando la misma sintaxis que PIVOT.

Nota: Este ejemplo funciona en SQL 2008 y 2005.

Este ejemplo demuestra cómo UNPIVOT se puede utilizar para eliminar la repetición de grupos de columna, a menudo visto en tablas no normalizadas.

1. Creamos una tabla no normalizada con la repetición de la columna de Idioma:

CREATE TABLE dbo.TraductorIdioma
(IdTraductor INT NOT NULL,
Idioma1 VARCHAR(50),
Idioma2 VARCHAR(50),
Idioma3 VARCHAR(50))
GO

2. Insertamos datos en la tabla.

INSERT dbo.TraductorIdioma(IdTraductor, Idioma1, Idioma2, Idioma3)
VALUES( 1, 'Español', 'Inglés', 'Alemán')
INSERT dbo.TraductorIdioma(IdTraductor, Idioma1, Idioma2, Idioma3)
VALUES( 2, 'Español', 'Portugués', 'Francés')
INSERT dbo.TraductorIdioma(IdTraductor, Idioma1, Idioma2, Idioma3)
VALUES( 3, 'Español', NULL, NULL)
GO

3. Realizamos un SELECT normal (Resultado no normalizado).

image

4. Por último aplicamos un UNPIVOT para normalizar la información en nuestro SELECT.

SELECT IdTraductor,
TipoIdioma,
Idioma
FROM
(SELECT IdTraductor, Idioma1, Idioma2, Idioma3
FROM dbo.TraductorIdioma) c
UNPIVOT
(Idioma FOR TipoIdioma IN ([Idioma1], [Idioma2], [Idioma3])
) AS p

Resultado (Normalizado).

image

Espero les sea de ayuda, dejen comentarios.

Etiquetas de Technorati: ,,




[SQL-Select] Porque no utilizar SELECT *.

25 03 2009

Saludos amigos leyendo un libro de SQL 2008, me encontré con un párrafo muy interesante que creo les será de ayuda a las personas que empiezan con el desarrollo en TSQL, considero que no importa si es SQL 2000, 2005 o 2008.

El símbolo asterisco (*) devuelve todas las columnas para cada fila de tabla o vista en la que se consulta.

Recordemos que, como buena práctica, es mejor hacer referencia explícita a las columnas que deseemos recuperar en lugar de utilizar “SELECT *”.

Referencia explícita.

SELECT Id, Nombre, Apellidos FROM PRB_Usuario

Si desarrolla una aplicación que usa “SELECT *”, la aplicación pueden esperar las mismas columnas (en el mismo orden) de la consulta. Si más adelante se agrega una nueva columna a la tabla o vista, o si se reordenan las columnas de la tabla, se puede romper el llamando a la aplicación, ya que la nueva columna puede provocar un resultado inesperado.

Usar “SELECT *” también puede repercutir negativamente en:

  1. El rendimiento, ya que la consulta puede devolver más datos de los que se necesitan.
  2. El aumento del tamaño del conjunto de resultados y operaciones de recuperación de datos en la instancia de SQL Server.
  3. Para aplicaciones que requieren miles de transacciones por segundo, el número de columnas devueltas en el resultado puede tener un fuerte impacto.

En resumen use mejor: SELECT campo1, campo2, campo3 FROM TUTABLA

Evite usar: SELECT * FROM TUTABLA.

Espero les sea de ayuda, dejen comentarios.

Etiquetas de Technorati: ,

 








Seguir

Get every new post delivered to your Inbox.