martes, 7 de noviembre de 2006

SQL - Generar números de filas haciendo uso de Tablas Temporales

En el presente ejemplo veremos como enumerar el resultado de un consulta, la cual normalmente difiere de nuestros identificadores o claves internas en la base de datos. Esto lo podemos lograr haciendo uso de la función IDENTITY y de Tablas temporales.

IDENTITY

Nos permite generar valores secuenciales, con base en los parámetros que se establezcan SELECT IDENTITY(TipoDato, ValorInicial, Incremento) AS ID_Num

  • TipoDato .- puede ser cualquiera de la categoría de los enteros (excepto BIT).
  • ValorInicial .- indica el valor inicial del cual se generarán los valores.
  • Incremento.- define el incremento que habrá entre los valores generados.

Esta sentencia la podemos utilizar solo cuando SELECT contiene la clausula INTO.

Tablas Temporales

Para hacer uso de la clausula INTO creamos una tabla temporal de la siguiente forma:

SELECT IDENTITY(INT, 1, 1) AS ID, CustomerID, CompanyName, ContactName, Country INTO #TMP_CUSTOMER FROM Customers ORDER BY Country SELECT * FROM #TMP_CUSTOMER DROP TABLE #TMP_CUSTOMER

En este ejemplo obtenemos los clientes de la tabla Customers ordenados por su campo Country de la base de datos Northwind y parte del resultado obtenido es:

IDCustomerIDCompanyNameContactNameCountry
1CACTUCactus Comidas para llevarPatricio SimpsonArgentina
2OCEANOcéano Atlántico Ltda.Yvonne MoncadaArgentina
3RANCHRancho grandeSergio GutiérrezArgentina
4PICCOPiccolo und mehrGeorg PippsAustria
5ERNSHErnst HandelRoland MendelAustria
6MAISDMaison DeweyCatherine DeweyBelgium
7SUPRDSuprêmes délicesPascale CartrainBelgium
8RICARRicardo AdocicadosJanete LimeiraBrazil
9TRADHTradição HipermercadosAnabela DominguesBrazil

Ahora, si la tabla de la cual vamos a obtener la información contiene una columna IDENTITY, el motor encontrará que hay 2 columnas INDENTITY en la tabla a generar, produciendo un error.

Para solucionar este problema es necesario convertir la columna IDENTITY de la tabla que causa el problema al mismo tipo de dato (lo que hacemos es quitarle el IDENTITY)

Por ejemplo, la tabla Products de la base de datos Northwind tiene definida la propiedad IDENTITY en la columna ProductID.

SELECT IDENTITY(INT, 1, 1) AS ID, CAST(ProductID AS INT) AS ProductID, ProductName INTO #TMP_PRODUCTS FROM Products SELECT * FROM #TMP_PRODUCTS DROP TABLE #TMP_PRODUCTS

Parte del resultado de este ejemplo es el siguiente:

IDProductIDProductName
117Alice Mutton
23Aniseed Syrup
340Boston Crab Meat
460Camembert Pierrot
518Carnarvon Tigers
61Chai
72Chang
839Chartreuse verte
94Chef Anton's Cajun Seasoning
105Chef Anton's Gumbo Mix

No hay comentarios.: