SQLServerCentral Article

Query Analyzer Extended

,

The SQL QUERY ANALYZER extended. Yakov Shlafman.

"I hear and I forget. I see and I remember. I do and I understand." - Confucius.

Although the SQL Query Analyzer and all its tools provide a very large spectrum of functions in some situations, you may feel you need more functions and more tools. Why? While developing or debugging stored procedures, functions, batches, add-hoc reports and others Transact-SQL related scripts, you want to have all necessary tools available on the current screen. If you have them, you do not need to jump between windows, sessions and tools. You do not want to waste your time.

Here is a little example: In the Object Browser you can see all the columns of a table, but you cannot see if a column has the identity property set and seed and increment values. Yes, you can generate the create table statement the to clipboard or to a new window, but these are extra steps and extra time...

Now, please compare two create table statements: First format, Generated by SQL Query Analyzer

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

Second format, Generated by user stored procedure:

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)
)

I prefer the second format. You should be aware - no matter what format you use to create a table Query Analyzer or Enterprise Manager will always return your code in First format. This is one of the reasons why I use, develop and modify my scripts and safe them in Visual Source Safe. I could open my script in the format I developed it and this is important... There are third party tools to generate your code from database (reverse engineering) and they do great job but it's not enough... And please do not tell me that in SQL Server 2005 we are going to miss these features again.

To write or debug a stored procedure or Transact-SQL script you may need information about a table - column names and data types. This information should be available for use in different formats. To speed up the typing process, you can use user stored procedure up_CT_Q (up stands for user procedure, CT stands for Cut Typing, Q stands for Query and informs that no Insert, Update or Delete statements are used in this procedure). Stored procedure up_CT_Q (SBE001_STP01_CT_Q.SQL) returns table or view information in needed formats. All examples below were ran in Northwind database against the table Customers.

Here is the description of different formats of output generated by procedure up_CT_Q:

------------
Format 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)

This is useful for a quick check of datatype and column length. It could be used as input parameters list of a stored procedure. Could be used in create table statement for Reverse Engineering when table should be dropped and created again with modified definition.

------------
Format 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)

This is useful for declaring variables in a stored procedure.

----------------------
Format 3, type 1
----------------------
CustomerID
,CompanyName
,ContactName
,ContactTitle
,Address
,City
,Region
,PostalCode
,Country
,Phone
,Fax

In this format a Select or Insert statement is easier to read and manage. If table contains a column with identity property you should list all not null columns in an Insert statement. In this format it's easier to comment out a column(s) if needed. You could get a select statement generated by SQL Query Analyzer but if a table has multiple columns this select will be difficult to read and modify. The rule number 1 of my standards is – any line of a script shoud feet into the width of the scrieen.

----------------------
Format 3, type 2
----------------------
Cust.CustomerID
,Cust.CompanyName
,Cust.ContactName
,Cust.ContactTitle
,Cust.Address
,Cust.City
,Cust.Region
,Cust.PostalCode
,Cust.Country
,Cust.Phone
,Cust.Fax

In addition to type 1, all column names are prefixed by alias name. Useful for all kinds of joins and subqueries.

----------------------
Format 3 type 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]

This makes easier the column renaming coding when the output should have column names

different then in the tables.

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

This format is used in "where" clause of Select, Update or Delete statement in stored procedure.

-------------------------------------------
Format 5, no input parameters provided
-------------------------------------------

To get procedure description run it without any parameters. You will get:

----------------------------
DOCUMENTATION and USAGE
----------------------------
The user defined stored procedure up_CT_Q is used for Reverse Engineering and
for simplifying the script writing and debugging processes.
The first input parameter is the table name
The second input parameter is the Format Number that represents the format 
of the output.
FormatNumber = 1, column name and its datatype list is returned.
This is useful as input parameters list of a stored procedure
FormatNumber = 2, column name prefixed by @ sign.
useful for declaring variables in a stored procedure
FormatNumber = 3 Type 1, returns all column names, in vertical, one column 
table format.
In this format a Select or Insert statement is easier to read and manage if 
there is a
need to comment out a column
FormatNumber = 3 Type 2, in addition to type 1, all column names are prfixed 
by alias name.
FormatNumber = 3 Type 3, makes easier the column renaming coding.
FormatNumber = 4, is used in "where" clause of Select, Update or Delete 
statement.
If table name is not supplied the procedure returns the description and 
usage examples of this procedure.
Examples, using table Customers in Northwind database
Examples:
Example 1, Format 1,                               exec up_CT_Q Customers,1
Example 2, Format 2,                               exec up_CT_Q Customers,2
Example 3, Format 3, Type 1                        exec up_CT_Q 
Customers,3,1
Example 3, Format 3, Type 2                        exec up_CT_Q 
Customers,3,2,Cust
Example 3, Format 3, Type 3                        exec up_CT_Q 
Customers,3,3,Cust
Example 4, Format 4,                               exec up_CT_Q Customers,4
Example 5, to get procedure description:           exec up_CT_Q

The source code is in the file SBE001_STP01_CT_Q.txt. This article could be a part of a "Standards by Examples" discussion. You may see how documentation standards are applied to the written procedure and its description of the script.

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating