Technical Article

DIff between Max length of value in CHAR type Colu

,

This Script finds the maximum length of a value in Character type Column.(CHAR,VARCHAR,NVARCHAR) and finds the difference between the Total lenghth and maximum value inserted

BEGIN

SET ANSI_WARNINGS OFF

Declare @tab_name varchar(50)
declare @co_name varchar(50)
declare  cursor1 cursor for 
--SELECT table_name,column_name from system tables for columns of type CHAR,NCHAR,VARCHAR,NVARCHAR of Columns having name 'NO' and 'NUMBER'

Select  '['+ y.name +']' as Table_name  , x.name as Column_name From syscolumns x
inner join   sysobjects y on x.id = y.id
where x.xtype  in ('231' , '239','167','175') and y.xtype ='U' and (x.name like '%NUMBER' OR X.NAME LIKE '%NO')

        OPEN  CURSOR1
FETCH NEXT from cursor1 into @tab_name,@co_name
                PRINT '    THE DIFF BETWEEN COLUMN WIDTH AND MAXIMUM VALUE IN FOLLOWING COLUMNS IS LESS THAN 4 '
PRINT '----------------------------------------------------------------------------------------------'
       While @@fetch_status = 0
          begin
                        --EXECUTING DYNAMIC SQL TO GET THE MAXIMUM LENGTH OF VALUE IN BYTES FOR A COLUMN 
DECLARE @SQLString NVARCHAR(500)
                DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @MYVALUE INT
                                DECLARE @DIFFVALUE INT 

                 SET @SQLString ='SELECT @MYVALUEOUT =  max(datalength('+'['+@co_name+']'+'))from '+@tab_name 
                 
SET @ParmDefinition = '@MYVALUEOUT INT OUTPUT'
EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@MYVALUEOUT = @MYVALUE OUTPUT
 
--EXECUTING DYNAMIC SQL TO GET THE TOTAL LENGTH IN BYTES OF A COLUMN 

                DECLARE @SQLString1 NVARCHAR(500)
                DECLARE @ParmDefinition1 NVARCHAR(500)
DECLARE @MYVALUE1 INT

                set @SQLString1 ='select @MYVALUEOUT1 = COL_LENGTH('+''''+@tab_name+''''+','+''''+@co_name+''''+')' 
SET @ParmDefinition1 = '@MYVALUEOUT1 INT OUTPUT'
EXECUTE sp_executesql
@SQLString1,
@ParmDefinition1,
@MYVALUEOUT1 = @MYVALUE1 OUTPUT


        --DIFFERENCE OF TOTAL LENGHT AND MAXIMUM VALUE LENGHTH IN BYTES 
                SET @DIFFVALUE = (@MYVALUE1 - @MYVALUE)
IF @DIFFVALUE <= 4 
BEGIN
DECLARE @PRINTSTRING VARCHAR(500)
  SET @PRINTSTRING = @CO_NAME +SPACE(2)+ 'COLUMN'+SPACE(2)+'IN TABLE'+SPACE(3)+rtrim(@TAB_NAME)+SPACE(3)+'DIFFERENCE IS' +SPACE(2)+ CAST(@DIFFVALUE AS VARCHAR)
--SET @PRINTSTRING = 'THE '+ rtrim(@CO_NAME)+SPACE(5)+ 'COLUMN'+SPACE(5)+cast(@MYVALUE1 AS varchar) +'W'+ SPACE(2)+CAST(@MYVALUE AS varCHAR) +'V '+SPACE(5)+'IN TABLE ' +rtrim(@TAB_NAME) 
--SET @PRINTSTRING = 'THE '+ rtrim(@CO_NAME)+ SPACE(5)+ cast(@MYVALUE1 AS varchar) +' '+ CAST(@MYVALUE AS varCHAR) +' '+' COLUMN  IN TABLE ' +rtrim(@TAB_NAME) + 'IS LESS THAN 4 CHARACTER FROM ITS ORIGIONAL LENGHTH'
          
PRINT @PRINTSTRING
END

                SET @MYVALUE = 0
SET @MYVALUE1 =0
   SET @DIFFVALUE =0          
           FETCH NEXT from CURSOR1 into @tab_name,@co_name
           END
CLOSE CURSOR1
DEALLOCATE  CURSOR1
SET ANSI_WARNINGS ON
END


--ONE CAN VERIFY  THE VALUE RETURNED BY THIS SCRIPT BY FOLLOWING SQL COMMANDS

--IN FOLLOWING EXAMPLE  << TYPES_ARA >> IS TABLE NAME .  <<TYPEID>> IS COLUMN_NAME 
--SELECT COL_LENGTH('Types_ara','TypeId')
--SELECT MAX(datalength(ltrim(rtrim(TypeId)))) from Types_ara

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating