Published on

January 27, 2008

Mejorando el Analizador de Consultas de SQL Server

“Escucho y olvido. Veo y recuerdo. Hago y entiendo.” – Confucio.

Como desarrolladores de SQL Server, a menudo nos encontramos en situaciones en las que necesitamos más funciones y herramientas para desarrollar y depurar de manera eficiente procedimientos almacenados, funciones, lotes e informes ad-hoc. Saltar entre ventanas, sesiones y herramientas puede ser lento e ineficiente.

Consideremos un escenario en el que queremos ver todas las columnas de una tabla en el Explorador de Objetos. Desafortunadamente, no podemos ver si una columna tiene la propiedad de identidad establecida y los valores de inicio e incremento. Aunque podemos generar la declaración de creación de tabla para ver esta información, implica pasos adicionales y tiempo.

Ahora, comparemos dos declaraciones de creación de tabla:

Primer formato, generado por el Analizador de Consultas de SQL:

CREATE TABLE [Orders] (
[OrderID] [int] IDENTITY (1, 1) NOT NULL ,
[CustomerID] [nchar] (5) COLLATE Cyrillic_General_CI_AS NULL ,
[EmployeeID] [int] NULL ,
[OrderDate] [datetime] NULL ,
[RequiredDate] [datetime] NULL ,
[ShippedDate] [datetime] NULL ,
[ShipVia] [int] NULL ,
[Freight] [money] NULL CONSTRAINT [DF_Orders_Freight] DEFAULT (0),
[ShipName] [nvarchar] (40) COLLATE Cyrillic_General_CI_AS NULL ,
[ShipAddress] [nvarchar] (60) COLLATE Cyrillic_General_CI_AS NULL ,
[ShipCity] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL ,
[ShipRegion] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL ,
[ShipPostalCode] [nvarchar] (10) COLLATE Cyrillic_General_CI_AS NULL ,
[ShipCountry] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL
)
GO

Segundo formato, generado por procedimiento almacenado de usuario:

create table Orders (
OrderID            int
,CustomerID         nchar(5)
,EmployeeID         int
,OrderDate          datetime
,RequiredDate       datetime
,ShippedDate        datetime
,ShipVia            int
,Freight            money
,ShipName           nvarchar(40)
,ShipAddress        nvarchar(60)
,ShipCity           nvarchar(15)
,ShipRegion         nvarchar(15)
,ShipPostalCode     nvarchar(10)
,ShipCountry        nvarchar(15)
)

Personalmente, prefiero el segundo formato. Sin embargo, es importante tener en cuenta que sin importar el formato que utilice para crear una tabla, el Analizador de Consultas o el Administrador Empresarial siempre devolverán su código en el primer formato. Por eso uso, desarrollo y modifico mis scripts y los guardo en Visual Source Safe. Esto me permite abrir mi script en el formato en el que lo desarrollé, lo cual es crucial para mantener la consistencia.

Aunque existen herramientas de terceros disponibles para generar código a partir de una base de datos (ingeniería inversa), es posible que no proporcionen todas las características necesarias. Además, vale la pena mencionar que SQL Server 2005 puede no tener estas características.

Cuando se escribe o depura un procedimiento almacenado o un script de Transact-SQL, a menudo es necesario tener información sobre una tabla, como nombres de columnas y tipos de datos, fácilmente disponibles en diferentes formatos. Para agilizar el proceso de escritura, se puede utilizar un procedimiento almacenado de usuario llamado up_CT_Q (up significa procedimiento de usuario, CT significa Cortar Escritura, Q significa Consulta, lo que indica que no se utilizan declaraciones de inserción, actualización o eliminación en este procedimiento).

El procedimiento almacenado up_CT_Q devuelve información de tabla o vista en varios formatos. Veamos algunos ejemplos utilizando la tabla Customers en la base de datos Northwind:

Formato 1:

CustomerID       nchar(5)
,CompanyName      nvarchar(40)
,ContactName      nvarchar(30)
,ContactTitle     nvarchar(30)
,Address          nvarchar(60)
,City             nvarchar(15)
,Region           nvarchar(15)
,PostalCode       nvarchar(10)
,Country          nvarchar(15)
,Phone            nvarchar(24)
,Fax              nvarchar(24)

Este formato es útil para verificar rápidamente el tipo de datos y la longitud de la columna. Se puede utilizar como lista de parámetros de entrada para un procedimiento almacenado o en una declaración de creación de tabla para ingeniería inversa cuando sea necesario eliminar y crear una tabla con una definición modificada.

Formato 2:

Declare @CustomerID       nchar(5)
Declare @CompanyName      nvarchar(40)
Declare @ContactName      nvarchar(30)
Declare @ContactTitle     nvarchar(30)
Declare @Address          nvarchar(60)
Declare @City             nvarchar(15)
Declare @Region           nvarchar(15)
Declare @PostalCode       nvarchar(10)
Declare @Country          nvarchar(15)
Declare @Phone            nvarchar(24)
Declare @Fax              nvarchar(24)

Este formato es útil para declarar variables en un procedimiento almacenado.

Formato 3, tipo 1:

CustomerID
,CompanyName
,ContactName
,ContactTitle
,Address
,City
,Region
,PostalCode
,Country
,Phone
,Fax

En este formato, una declaración Select o Insert es más fácil de leer y gestionar. Si una tabla contiene una columna con la propiedad de identidad, se deben enumerar todas las columnas no nulas en una declaración Insert. Este formato también facilita comentar una columna si es necesario. Si bien el Analizador de Consultas de SQL puede generar una declaración Select, se vuelve difícil de leer y modificar cuando una tabla tiene múltiples columnas. Como buena práctica, cada línea de un script debe ajustarse al ancho de la pantalla.

Formato 3, tipo 2:

Cust.CustomerID
,Cust.CompanyName
,Cust.ContactName
,Cust.ContactTitle
,Cust.Address
,Cust.City
,Cust.Region
,Cust.PostalCode
,Cust.Country
,Cust.Phone
,Cust.Fax

Además del tipo 1, todos los nombres de columna tienen un prefijo de nombre de alias. Este formato es útil para varias uniones y subconsultas.

Formato 3, tipo 3:

Cust.CustomerID       as [CustomerID]
,Cust.CompanyName      as [CompanyName]
,Cust.ContactName      as [ContactName]
,Cust.ContactTitle     as [ContactTitle]
,Cust.Address          as [Address]
,Cust.City             as [City]
,Cust.Region           as [Region]
,Cust.PostalCode       as [PostalCode]
,Cust.Country          as [Country]
,Cust.Phone            as [Phone]
,Cust.Fax              as [Fax]

Este formato facilita cambiar el nombre de las columnas cuando la salida debe tener nombres diferentes a los de la tabla.

Formato 4:

CustomerID       = @CustomerID
,CompanyName      = @CompanyName
,ContactName      = @ContactName
,ContactTitle     = @ContactTitle
,Address          = @Address
,City             = @City
,Region           = @Region
,PostalCode       = @PostalCode
,Country          = @Country
,Phone            = @Phone
,Fax              = @Fax

Este formato se utiliza en la cláusula “where” de las declaraciones Select, Update o Delete en un procedimiento almacenado.

Formato 5, no se proporcionan parámetros de entrada:

Para obtener la descripción del procedimiento, simplemente ejecútelo sin ningún parámetro. Esto proporcionará la siguiente información:

DOCUMENTACIÓN y USO

El procedimiento almacenado definido por el usuario up_CT_Q se utiliza para la ingeniería inversa y para simplificar los procesos de escritura y depuración de scripts.

El primer parámetro de entrada es el nombre de la tabla.

El segundo parámetro de entrada es el Número de Formato que representa el formato de la salida.

FormatNumber = 1: se devuelve una lista de nombres de columna y sus tipos de datos. Esto es útil como lista de parámetros de entrada para un procedimiento almacenado.

FormatNumber = 2: se devuelve el nombre de columna con el prefijo @. Útil para declarar variables en un procedimiento almacenado.

FormatNumber = 3 Tipo 1: se devuelven todos los nombres de columna en un formato de tabla vertical de una columna. En este formato, una declaración Select o Insert es más fácil de leer y gestionar si es necesario comentar una columna.

FormatNumber = 3 Tipo 2: además del tipo 1, todos los nombres de columna tienen un prefijo de nombre de alias.

FormatNumber = 3 Tipo 3: facilita cambiar el nombre de las columnas.

FormatNumber = 4: se utiliza en la cláusula "where" de las declaraciones Select, Update o Delete.

Si no se proporciona el nombre de la tabla, el procedimiento devuelve la descripción y ejemplos de uso de este procedimiento.

Ejemplos, utilizando la tabla Customers en la base de datos Northwind:

Ejemplo 1, Formato 1: exec up_CT_Q Customers,1
Ejemplo 2, Formato 2: exec up_CT_Q Customers,2
Ejemplo 3, Formato 3, Tipo 1: exec up_CT_Q Customers,3,1
Ejemplo 3, Formato 3, Tipo 2: exec up_CT_Q Customers,3,2,Cust
Ejemplo 3, Formato 3, Tipo 3: exec up_CT_Q Customers,3,3,Cust
Ejemplo 4, Formato 4: exec up_CT_Q Customers,4
Ejemplo 5, para obtener la descripción del procedimiento: exec up_CT_Q

Utilizando el procedimiento almacenado up_CT_Q, podemos mejorar la funcionalidad del Analizador de Consultas de SQL Server y simplificar los procesos de escritura y depuración de scripts. Este procedimiento proporciona varios formatos de salida que se adaptan a diferentes necesidades, lo que facilita trabajar con tablas y columnas.

Recuerda, como desarrolladores, es importante encontrar formas de optimizar nuestro flujo de trabajo y ahorrar tiempo. El procedimiento almacenado up_CT_Q es solo un ejemplo de cómo podemos lograr esto en SQL Server.

¡Gracias por leer!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.