Important alert: (current site time 7/15/2013 7:16:45 PM EDT)
 

VB icon

TSQLINDENTER

Email
Submitted on: 8/21/2006 4:19:08 PM
By: Aitor Solozabal Merino 
Level: Beginner
User Rating: By 1 Users
Compatibility: SQL Server 2000, SQL Server 7.0, SQL Server 6.5 and earlier, Other
Views: 7181
(About the author)
 
     STORED PROCEDURE WRITTEN IN T-SQL TO INDENT A T-SQL SOURCE CODE AND SHOW IF THERE IS A DIFFERENCE BETWEEN THE NUMBER OF COMMANDS BEGIN AND COMMANDS END. ALSO IT SHOWS HOW TO OPEN AND READ A TEXT FILE AND HOW TO WRITE A TEXT FILE IN THE HARD DISK
 
Can't Copy and Paste this?
Click here for a copy-and-paste friendly version of this code!
--**************************************
-- for :TSQLINDENTER
--**************************************
This PROCEDURE is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation in any version of the License. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
code:
Can't Copy and Paste this?
Click here for a copy-and-paste friendly version of this code!
 
Terms of Agreement:   
By using this code, you agree to the following terms...   
  1. You may use this code in your own programs (and may compile it into a program and distribute it in compiled format for languages that allow it) freely and with no charge.
  2. You MAY NOT redistribute this code (for example to a web site) without written permission from the original author. Failure to do so is a violation of copyright laws.   
  3. You may link to this code from another website, but ONLY if it is not wrapped in a frame. 
  4. You will abide by any additional copyright restrictions which the author may have placed in the code or code's description.
				
--**************************************
-- Name: TSQLINDENTER
-- Description:STORED PROCEDURE WRITTEN IN T-SQL TO INDENT A T-SQL SOURCE CODE AND SHOW IF THERE IS A DIFFERENCE BETWEEN THE NUMBER OF COMMANDS BEGIN AND COMMANDS END.
ALSO IT SHOWS HOW TO OPEN AND READ A TEXT FILE AND HOW TO WRITE A TEXT FILE IN THE HARD DISK
-- By: Aitor Solozabal Merino
--
-- Inputs:THE NAME OF THE TEXT FILE WITH THE T-SQL CODE
--
-- Returns:0 IF ALL GOES WELL
--
-- Assumes:IT IS A GOOD PRACTICE TO WRITE THE COMMANDS TO FLOW CONTROL IN THE SAME LINE IF THE PAIR BEGIN-END IS NOT USED
--
-- Side Effects:THE UTILITY WRITE A NEW TEXT FILE WITH THE CODE INDENTED WITH THE WORD 'NEW' ADDED
--
--This code is copyrighted and has-- limited warranties.Please see http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=1090&lngWId=5--for details.--**************************************

---------------------------------------------------------------------
-- APPLICATION : UTILITY TO INDENT T-SQL SOURCE CODE
-- AUTHOR: AITOR SOLOZABAL MERINO ( SPAIN )
-- EMAIL: aitor-3@euskalnet.net
-- TITLE: T-SQL-INDENTER
-- DESCRIPTION : PROCEDURE WRITTEN IN T-SQL TO BASIC INDENT OF SOURCE
--TRANSACT SQL CODE
-- DATE : 21/08/2006
-- RETURN VALUE : 0 SI NO HA HABIDO ERRORES
----------------------------------------------------------------------
IF OBJECT_ID('TSQLINDENTER') IS NOT NULL DROP PROCEDURE TSQLINDENTER
GO
CREATE PROCEDURE TSQLINDENTER
(
-- sample : EXECUTE TSQLINDENTER 'PROGRAM.SQL'
@NOMFIC VARCHAR(250), --'PROGRAM.SQL'
@RETURNVALUE INT=NULL OUT
)
AS
BEGIN
 -- VARIABLES DECLARATION
 ------------------------------
 DECLARE @NUMBEGIN INT
 DECLARE @NUMTABS INT
 DECLARE @COMANDO VARCHAR(8000)
 DECLARE @COMAND_BEGIN VARCHAR(10)
 DECLARE @COMAND_END VARCHAR(3)
 DECLARE @CARACTER1 INT
 --FILE SYSTEM OBJECT VARIABLES
 ------------------------------
 DECLARE @FS1 int
 DECLARE @FS2 INT
 DECLARE @RecordsExist int
 DECLARE @FileID1 int
 DECLARE @FileID2 int
 DECLARE @File1 VARCHAR(1000)
 DECLARE @File2 VARCHAR(1000)
 DECLARE @ForReading int
 DECLARE @ForWriting int
 DECLARE @ForAppending int
 DECLARE @FileLine varchar(8000)
 DECLARE @RC INT
 ------------------------------
 SET @ForReading = 1
 SET @ForWriting = 2
 SET @ForAppending = 8
 SET @RecordsExist = 0
 ------------------------------
 SET @NUMBEGIN = 0
 SET @NUMTABS = 0
 SET @RETURNVALUE = 1
 ------------------------------
 IF @NOMFIC IS NOT NULL
 BEGIN
SET NOCOUNT ON
SET @NOMFIC=RTRIM(LTRIM(@NOMFIC))
EXEC master..xp_fileexist @NOMFIC, @RC OUTPUT
IF (@@ERROR = 0) AND (@RC = 1)
BEGIN
 ------------------------------
 SET @File1 = @NOMFIC
 SET @File2 = LEFT(@NOMFIC,LEN(@NOMFIC)-4)+'-NEW.SQL'
 -- Crear un objeto de fichero para la creación del archivo de lectura
 -- Create a file object to read a file
 EXECUTE @RC = sp_OACreate 'Scripting.FileSystemObject', @FS1 OUT
 IF (@@ERROR|@RC > 0 Or @FS1 < 0) RAISERROR ('No se puede crear un objeto fichero FS1.',16,1)
 -- Crear un objeto de fichero para la creación del archivo de escritura
 -- Create a file object to write a file
 EXECUTE @RC = sp_OACreate 'Scripting.FileSystemObject', @FS2 OUT
 IF (@@ERROR|@RC > 0 Or @FS2 < 0) RAISERROR ('No se puede crear un objeto fichero FS2.',16,1)
 -- Obtener un identificador de fichero para la apertura del archivo de lectura
 -- Obtain a file identifier to open the file to read
 EXECUTE @RC = sp_OAMethod @FS1, 'OpenTextFile', @FileID1 OUT, @File1, @ForReading,True
 IF (@@ERROR|@RC > 0 Or @FileID1 < 0) RAISERROR ('No se puede abrir el fichero FileID1=%s',16,1,@File1)
 -- Obtener un identificador de fichero para la creación y/o apertura del archivo de escritura
 -- Obtain a file identifier to create/open the file to write
 EXECUTE @RC = sp_OAMethod @FS2, 'OpenTextFile', @FileID2 OUT, @File2, @ForWriting,True
 IF (@@ERROR|@RC > 0 Or @FileID2 < 0) RAISERROR ('No se puede abrir el fichero FileID2=%s',16,1,@File2)
 ------------------------------
 EXECUTE @RecordsExist = sp_OAMethod @FileID1, 'ReadLine', @FileLine OUTPUT
 WHILE @RecordsExist >= 0
 BEGIN
------------------------------
SET @COMAND_BEGIN=''
SET @COMAND_END=''
SET @COMANDO=RTRIM(LTRIM(@FileLine))
------------------------------
IF LEN(@COMANDO)>0
BEGIN
 -- Bucle para extraer el primer caracter de la cadena si es menor ó igual que el espacio en blanco chr(32) y mayor que el co¡digo 126
 -- Loop to extract the first character of the string if it is lower or equal to space chr(32) or upper than 126
 SET @CARACTER1=ASCII(LEFT(@COMANDO,1))
 WHILE (LEN(@COMANDO)>1) AND ((@CARACTER1<=32) OR (@CARACTER1>=127))
 BEGIN
IF LEN(@COMANDO)>1
BEGIN
 SET @COMANDO=RIGHT(@COMANDO,LEN(@COMANDO)-1)
 SET @CARACTER1=ASCII(LEFT(@COMANDO,1))
END
 END
 
 IF LEN(@COMANDO)>=10
 BEGIN
SET @COMAND_BEGIN=UPPER(RTRIM(LEFT(@COMANDO, 10)))
IF @COMAND_BEGIN <>'BEGIN TRAN' SET @COMAND_BEGIN=UPPER(RTRIM(LEFT(@COMANDO, 5)))
 END
 ELSE
 BEGIN
IF LEN(@COMANDO)>=5 SET @COMAND_BEGIN=UPPER(RTRIM(LEFT(@COMANDO, 5)))
 END
 IF LEN(@COMANDO)>=3 SET @COMAND_END=UPPER(RTRIM(LEFT(@COMANDO, 3)))
 IF @COMAND_BEGIN='BEGIN'
 BEGIN
SET @NUMBEGIN=@NUMBEGIN+1
SET @NUMTABS=@NUMTABS+1
IF (@NUMTABS>0) SET @COMANDO=SPACE((@NUMTABS*3))+@COMANDO
SET @NUMTABS=@NUMTABS+1
 END
 IF @COMAND_END='END'
 BEGIN
SET @NUMBEGIN=@NUMBEGIN-1
SET @NUMTABS=@NUMTABS-1
IF (@NUMTABS>0) SET @COMANDO=SPACE((@NUMTABS*3))+@COMANDO
SET @NUMTABS=@NUMTABS-1
 END
 IF (@COMAND_BEGIN<>'BEGIN') AND (@COMAND_END<>'END')
 BEGIN
IF (@NUMTABS>0) SET @COMANDO=SPACE((@NUMTABS*3))+@COMANDO
 END
END
EXECUTE @RC = sp_OAMethod @FileID2, 'WriteLine', NULL, @COMANDO
--IF (@@ERROR|@RC > 0) RAISERROR ('No se ha podido escribir en el fichero ',16,1)
IF (@@ERROR|@RC > 0) RAISERROR ('Couldn´t write to the the file ',16,1)
EXECUTE @RecordsExist = sp_OAMethod @FileID1, 'ReadLine', @FileLine OUTPUT
 END
 EXECUTE @RC = sp_OAMethod @FileID1, 'Close', NULL
 --IF (@@ERROR|@RC > 0) RAISERROR ('No se ha podido cerrar el fichero FileID1=%s',16,1,@File1)
 IF (@@ERROR|@RC > 0) RAISERROR ('Couldn´t close the file FileID1=%s',16,1,@File1)
 EXECUTE @RC = sp_OAMethod @FileID2, 'Close', NULL
 --IF (@@ERROR|@RC > 0) RAISERROR ('No se ha podido cerrar el fichero FileID2=%s',16,1,@File2)
 IF (@@ERROR|@RC > 0) RAISERROR ('Couldn´t close the file FileID2=%s',16,1,@File2)
 EXECUTE @RC = sp_OADestroy @FileID1
 --IF (@@ERROR|@RC > 0) RAISERROR ('No se ha podido destruir la identidad del fichero FileID1',16,1)
 IF (@@ERROR|@RC > 0) RAISERROR ('Couldn´t destroy the identity of the file FileID1',16,1)
 EXECUTE @RC = sp_OADestroy @FileID2
 --IF (@@ERROR|@RC > 0) RAISERROR ('No se ha podido destruir la identidad del fichero FileID2',16,1)
 IF (@@ERROR|@RC > 0) RAISERROR ('Couldn´t destroy the identity of the file FileID2',16,1)
 EXECUTE @RC = sp_OADestroy @FS1
 --IF (@@ERROR|@RC > 0) RAISERROR ('No se ha podido destruir el objeto FS1',16,1)
 IF (@@ERROR|@RC > 0) RAISERROR ('Couldn´t destroy the file object FS1',16,1)
 EXECUTE @RC = sp_OADestroy @FS2
 --IF (@@ERROR|@RC > 0) RAISERROR ('No se ha podido destruir el objeto FS2',16,1)
 IF (@@ERROR|@RC > 0) RAISERROR ('Couldn´t destroy the file object FS2',16,1)
 PRINT @NUMBEGIN
 IF @NUMBEGIN<>0
 BEGIN
--PRINT 'ERROR: El fichero '+@NOMFIC+' tiene un número desigual de BEGIN y END'
PRINT 'ERROR: The File '+@NOMFIC+' have not an equal number of commands BEGIN and END'
 END
 ELSE
 BEGIN
--PRINT 'El fichero '+@NOMFIC+' tiene un número igual de BEGIN y END'
PRINT 'The File '+@NOMFIC+' have an equal number of commands BEGIN and END'
SET @RETURNVALUE=0
 END
END
ELSE
BEGIN
 --PRINT 'ERROR: El fichero '+@NOMFIC+' no existe'
 PRINT 'ERROR: The File '+@NOMFIC+' not exist'
END
 END
 ELSE
 BEGIN
PRINT 'ERROR: El argumento con el nombre del fichero esta vacio'
 END
END


Report Bad Submission
Use this form to tell us if this entry should be deleted (i.e contains no code, is a virus, etc.).
This submission should be removed because:

Your Vote

What do you think of this code (in the Beginner category)?
(The code with your highest vote will win this month's coding contest!)
Excellent  Good  Average  Below Average  Poor (See voting log ...)
 

Other User Comments

8/21/2006 10:22:41 PMJeff Moden

Wouldn't mind seeing more comments but very much appreciate the translation on the comments that do exist. Thanks.

The sp_OA methods may be just what I need for loading XML documents... thank you for the idea.

(If this comment was disrespectful, please report it.)

 

Add Your Feedback
Your feedback will be posted below and an email sent to the author. Please remember that the author was kind enough to share this with you, so any criticisms must be stated politely, or they will be deleted. (For feedback not related to this particular code, please click here instead.)
 

To post feedback, first please login.