martes, 16 de agosto de 2011

Insertando valores en columnas identidad con SQL SERVER con IDENTITY_INSERT

Para poder insertar valores en columnas que tengan la propiedad de identidad en MS SQL Server empleamos la función IDENTTY_INSERT.

Las sintaxis es la siguiente:
SET IDENTITY_INSERT NombreDeTabla ON


--Aqui van los inserts
--especificando las columnas
--Ej. INSERT INTO NombreDeTabla (Col1, Col2)
--VALUES (Col2,Col)*/

SET IDENTITY_INSERT NombreDeTabla OFF
Es importante recordar volver a configurar la inserción de identidades automática despues de realizar las inserciones, mediante la instrucción SET IDENITY_INSERT OFF.

También es importante recalcar que se deben especificar las columnas a insertar, en caso contrario, SQL Server arrojará un error del tipo:

Error

An explicit value for the identity column in table '{TABLE}' can only be specified when a column list is used and IDENTITY_INSERT is ON.


jueves, 11 de agosto de 2011

INTERSECT en SQL Server

INTERSECT

Esta clausula devuelve los registros que concuerdan entre dos o más consultas comparadas. Automáticamente devuelve los registros distinctos y tal y como UNION y EXCEPT, las consultas comparadas deben tener los mismos números de columnas y los mismos tipos (o tipos comparables) en el mismo orden.
Ejemplo:
SELECT SKU

FROM  Productos

INTERSECT

SELECT SKU

FROM  Ventas
Claro, el mismo resultado puede ser obtenido mediante JOINS o mediante la cláusula IN, no obstante, si comparamos:
SELECT DISTINCT P.SKU

FROM  Productos P

INNER JOIN Ventas V

ON  P.Producto_ID = V.Producto_ID
A la consulta con JOIN se le tiene que agregar DISTINCT, y en caso de tener más de una columna, se le tiene que agregar una comparativa por cada columna.
SELECT SKU

FROM  Productos

WHERE SKU IN

(

 SELECT SKU

 FROM  Ventas

)
La consulta con la cláusula IN da el mismo resultado, no obstante, IN solo puede comparar columna por columna, mientras que INTERSECT puede comparar registros enteros, renglón por renglon.
En los casos en los que se tenga que comprar mas de una columna, las consultas con JOIN o con IN se volverán más y más complejas, o incluso imposibles de codificar, sobre todo cuando las consultas comparadas contengan JOIN's, IN's y otras cláusulas similares.

EXCEPT en SQL Server

EXCEPT

Una característica implementada desde la versión 2005, y una que siempre había estado buscado, una especie de "anti-join", que en lugar de unir las tablas las separe según ciertos parámetros.
Se puede considerar como la función contraria de UNION, ya que su función es devolver los registros de una consulta que no se encuentran en otra. Automáticamente devuelve los valores distintos.
La sintaxis es la siguiente:

SELECT [Col1], [Col2], ... [ColN]

FROM [Tabla1]

EXCEPT

SELECT [Col1], [Col2], ... [ColN]

FROM [Tabla2]
Ejemplo: Si queremos obtener una lista de productos que no han sido vendidos:

SELECT SKU

FROM  Productos

EXCEPT 

SELECT SKU

FROM  Ventas
EXCEPT, como unión, tiene como regla que las consultas comparadas deben tener el mismo número de columnas y los mismos tipos de datos (o por lo menos, los tipos de datos sean comparables) en el mismo orden.
Y también como UNION, puede ser utilizado con más de dos consultas.

miércoles, 3 de agosto de 2011

UNION: Unir dos o más consultas en SQL Server

UNION

La cáusula UNON nos permite unir dos o más consultas en un solo grupo de resultados. Para que funcione, todas las consultas tienen que tener la misma estructura en sus resultados: El mismo número de columnas, el mismo orden y el mismo tipo de datos en cada columna

Su sintaxis es la siguiente:

SELECT [Col1], [Col2], [Col3], ... [Coln]

FROM [Tabla1]

UNION {ALL}

SELECT [Col1], [Col2], [Col3],... [Coln]
FROM [Tabla2]

Ejemplo:

Tenemos la tabla StoreContact con la estructura

Customer_ID int
Contact_ID int
ContactType int
rowguid unique_identifier
ModifiedDate datetime


Y la tabla VendorContact con la estructura

Vendor_ID int
Contact_ID int
ContactType int
ModifiedDate datetime


Y las queremos unir en una sola consulta para obtener todos los registros de contactos en un solo conjunto de resultados. Procedemos:


SELECT Customer_ID, Contact_ID, ContactType, ModifiedDate
FROM StoreContact

UNION

SELECT Vendor_ID, Contact_ID, ContactType, ModifiedDate
FROM VendorContact


De esta manera, consultaremos los contactos en un solo conjunto de resultados. UNION puede seguirse utilizando para agregar más consultas de la misma manera, es decir, podríamos consultar conjuntamente, además de StoreContact y VendorContact, PersonContact y unirlos en la misma consulta.

La claúsula ALL sirve, como su nombre lo indica, para consultar todos los registros de todas las consultas unidas, ya que, por default, UNION consultará los registros distintos, como si declararamos la clausula DISTINCT.