Friday, 9 February 2018

Truncate Database All Table In SqlServer

DECLARE @tablas TABLE(tableName nvarchar(100))

INSERT INTO @tablas
SELECT t.TABLE_SCHEMA+ '.'+t.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES T

DECLARE @loopCounter INT
SELECT @loopCounter = 0
SELECT @loopCounter = COUNT(*) FROM INFORMATION_SCHEMA.TABLES

WHILE @loopCounter>0 
BEGIN
    SELECT TOP 1 @tableName = tableName FROM @tablas 
    DECLARE @sql NVARCHAR(500) = ''

    SET @sql = @sql +'Truncate table  '+ @tableName
    EXECUTE (@sql)
    SELECT @sql
    SET @loopCounter = @loopCounter-1   
    DELETE TOP (1) @tablas 
END

Wednesday, 31 January 2018

Return Newly Inserted Row In Sql Server

CREATE TABLE #TT
(
    ID uniqueidentifier NOT NULL
        DEFAULT newID(),
    name varchar(20),
    AreaCode INT
)

INSERT INTO #TT
(
    Name,
    AreaCode
)
OUTPUT INSERTED.ID,
       INSERTED.Name,
       INSERTED.AreaCode
SELECT 'SS',
       1
UNION ALL
SELECT 'SS1',
       2

DROP TABLE #TT

Recompile All Table, Stored Procedures and Function In SQL Server

CREATE PROCEDURE [dbo].[spEXECsp_RECOMPILE]
AS
BEGIN
    DECLARE @TableName varchar(128)
    DECLARE @OwnerName varchar(128)
    DECLARE @CMD1 varchar(8000)
    DECLARE @TableListLoop int
    DECLARE @TableListTable table
    (
        UIDTableList int IDENTITY(1, 1),
        OwnerName varchar(128),
        TableName varchar(128)
    )

    INSERT INTO @TableListTable
    (
        OwnerName,
        TableName
    )
    SELECT u.[Name],
           o.[Name]
    FROM sys.objects o
        INNER JOIN sys.schemas u
            ON o.schema_id = u.schema_id
    WHERE o.type IN (   'U', -- table
                        'P', -- stored procedures
                        'FN' -- scalar functions
                    )
    ORDER BY u.[Name],
             o.[Name]

    SELECT @TableListLoop = MAX(UIDTableList)
    FROM @TableListTable

    WHILE @TableListLoop > 0
    BEGIN
        SELECT @TableName = TableName,
               @OwnerName = OwnerName
        FROM @TableListTable
        WHERE UIDTableList = @TableListLoop

        SELECT @CMD1 = 'EXEC sp_recompile ' + '[' + @OwnerName + '.' + @TableName + ']' + char(13)

        --PRINT @CMD1
        EXECUTE (@CMD1)

        SELECT @TableListLoop = @TableListLoop - 1
    END

    SELECT *
    FROM @TableListTable

    SET NOCOUNT OFF

END
------------------------------------------------------
--To run used
EXECUTE [dbo].spEXECsp_RECOMPILE

Thursday, 25 January 2018

Custom serial number key generator in C# .NET

Create one class named RandomSNKGenerator

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AppCode
{

    public enum SNKeyLength
    {
        SN16 = 16, SN20 = 20, SN24 = 24, SN28 = 28, SN32 = 32
    }
   /// <summary>
   /// Supports Only 12 Digit
   /// </summary>
    public enum SNKeyNumLength
    {
        SN4 = 4, SN8 = 8, SN12 = 12
    }
    public static class RandomSNKGenerator
    {
        private static string AppendSpecifiedStr(int length, string str, char[] newKey)
        {
            string
            newKeyStr = "";
            int k = 0;
            for (int i = 0; i < length; i++)
            {
                for(k = i; k < 4 + i; k++)
                {
                    newKeyStr += newKey[k];
                }
                if (k == length)
                {
                    break;
                }
                else
                {
                    i = (k) - 1;
                    newKeyStr += str;
                }
            }
            return newKeyStr;
        }

        public static string GetSerialKeyAlphaNumaric(SNKeyLength keyLength)
        {
            Guid newguid = Guid.NewGuid();
            string randomStr = newguid.ToString("N");
            string tracStr = randomStr.Substring(0,(int)keyLength);
            tracStr = tracStr.ToUpper();
            char[] newKey = tracStr.ToCharArray();
            string newSerialNumber = "";
            switch (keyLength)
            {
                case SNKeyLength.SN16:newSerialNumber = AppendSpecifiedStr(16, "-", newKey);
                    break;
                case SNKeyLength.SN20: newSerialNumber = AppendSpecifiedStr(20, "-", newKey);
                    break;
                case SNKeyLength.SN24: newSerialNumber = AppendSpecifiedStr(24, "-", newKey);
                    break;
                case SNKeyLength.SN28: newSerialNumber = AppendSpecifiedStr(28, "-", newKey);
                    break;
                case SNKeyLength.SN32: newSerialNumber = AppendSpecifiedStr(32, "-", newKey);
                    break;
            }

            return newSerialNumber;
        }

        public static string GetSerialKeyNumaric(SNKeyNumLength keyLength)
        {
            Random rn = new Random();
            double sd = Math.Round(rn.NextDouble() * Math.Pow(10, (int)keyLength) + 4);
            return sd.ToString().Substring(0, (int)keyLength);
        }
    }
}

------------------------------------------------------------
string serialNumber = RandomSNKGenerator.GetSerialKeyAlphaNumaric(SNKeyLength.SN16);

or if you want to generate random number only :

string serialNumberNumberOnly = RandomSNKGenerator.GetSerialKeyNumaric(SNKeyNumLength.SN12);
  string serialNumber = AppCode.RandomSNKGenerator.GetSerialKeyAlphaNumaric(SNKeyLength.SN20);

Tuesday, 16 January 2018

Add a datarow in datatable at specified index

DataTable existingDataTable = GetMeDataFromSomeWhere();
//Add a new row to table
DataRow newRow = existingDataTable.NewRow();

newRow["ID"] = 999;
newRow["SomeColumn"] = "Manas Bhardwaj";

existingDataTable.Rows.Add(newRow);

//OR If nedd row add in a specific row 

existingDataTable.Rows.InsertAt(dr, 0);

Tuesday, 12 December 2017

Indian Currency To Words In Sql Server


CREATE FUNCTION [dbo].[GetNumberToWords] (@intNumberValue INTEGER)
RETURNS VARCHAR(2000)
AS
BEGIN
    DECLARE @strNumberString VARCHAR(9)
    DECLARE @strReturn VARCHAR(2000)
    DECLARE @intUnits SMALLINT

    -- Alter table of number groups
    DECLARE @tblNumberGroups TABLE
    (
        Units SMALLINT,
        Hundreds SMALLINT,
        Tens SMALLINT
    )

    -- Handle errors and 'quick wins'
    IF @intNumberValue IS NULL
        RETURN NULL
    IF ISNUMERIC(@intNumberValue) = 0
        RETURN NULL
    IF @intNumberValue = 0
        RETURN 'ZERO'

    IF @intNumberValue < 0
    BEGIN
        SET @strReturn = 'MINUS '
        SET @intNumberValue = ABS(@intNumberValue)
    END

    SET @intUnits = 0

    -- Populate table of number groups
    WHILE (@intNumberValue % 1000) > 0 OR (@intNumberValue / 1000) > 0
    BEGIN
        INSERT INTO @tblNumberGroups
        (
            Units,
            Hundreds,
            Tens
        )
        VALUES
        (@intUnits, (@intNumberValue % 1000) / 100, (@intNumberValue % 1000) % 100)
        SELECT @intNumberValue = CAST(@intNumberValue / 1000 AS INTEGER)
        SET @intUnits = @intUnits + 1
    END

    -- Remove last unit added
    SET @intUnits = @intUnits - 1

    -- Concatenate text number by reading number groups in reverse order
    SELECT @strReturn
        = ISNULL(@strReturn, ' ')
          + ISNULL(
                      ISNULL((CASE Hundreds
                                  WHEN 1 THEN
                                      'ONE HUNDRED '
                                  WHEN 2 THEN
                                      'TWO HUNDRED '
                                  WHEN 3 THEN
                                      'THREE HUNDRED '
                                  WHEN 4 THEN
                                      'FOUR HUNDRED '
                                  WHEN 5 THEN
                                      'FIVE HUNDRED '
                                  WHEN 6 THEN
                                      'SIX HUNDRED '
                                  WHEN 7 THEN
                                      'SEVEN HUNDRED '
                                  WHEN 8 THEN
                                      'EIGHT HUNDRED '
                                  WHEN 9 THEN
                                      'NINE HUNDRED '
                              END
                             ),
                             ' '
                            ) + CASE
                                    WHEN (
                                             Hundreds > 0
                                             OR Units < @intUnits
                                         )
                                         AND Tens > 0 THEN
                                        ' AND '
                                    ELSE
                                        ' '
                                END + ISNULL(   (CASE Tens / 10
                                                     WHEN 2 THEN
                                                         'TWENTY '
                                                     WHEN 3 THEN
                                                         'THIRTY '
                                                     WHEN 4 THEN
                                                         'FORTY '
                                                     WHEN 5 THEN
                                                         'FIFTY '
                                                     WHEN 6 THEN
                                                         'SIXTY '
                                                     WHEN 7 THEN
                                                         'SEVENTY '
                                                     WHEN 8 THEN
                                                         'EIGHTY '
                                                     WHEN 9 THEN
                                                         'NINETY '
                                                 END
                                                ),
                                                ' '
                                            ) + ISNULL(   (CASE Tens
                                                               WHEN 10 THEN
                                                                   'TEN '
                                                               WHEN 11 THEN
                                                                   'ELEVEN '
                                                               WHEN 12 THEN
                                                                   'TWELVE '
                                                               WHEN 13 THEN
                                                                   'THIRTEEN '
                                                               WHEN 14 THEN
                                                                   'FOURTEEN '
                                                               WHEN 15 THEN
                                                                   'FIFTEEN '
                                                               WHEN 16 THEN
                                                                   'SIXTEEN '
                                                               WHEN 17 THEN
                                                                   'SEVENTEEN '
                                                               WHEN 18 THEN
                                                                   'EIGHTEEN '
                                                               WHEN 19 THEN
                                                                   'NINETEEN '
                                                           END
                                                          ),
                                                          ' '
                                                      )
                      + COALESCE(
CASE
WHEN Tens % 10 = 1
AND Tens / 10 <> 1 THEN
'ONE '
END,
CASE
WHEN Tens % 10 = 2
AND Tens / 10 <> 1 THEN
'TWO '
END,
CASE
WHEN Tens % 10 = 3
AND Tens / 10 <> 1 THEN
'THREE '
END,
CASE
WHEN Tens % 10 = 4
AND Tens / 10 <> 1 THEN
'FOUR '
END,
CASE
WHEN Tens % 10 = 5
AND Tens / 10 <> 1 THEN
'FIVE '
END,
CASE
WHEN Tens % 10 = 6
AND Tens / 10 <> 1 THEN
'SIX '
END,
CASE
WHEN Tens % 10 = 7
AND Tens / 10 <> 1 THEN
'SEVEN '
END,
CASE
WHEN Tens % 10 = 8
AND Tens / 10 <> 1 THEN
'EIGHT '
END,
CASE
WHEN Tens % 10 = 9
AND Tens / 10 <> 1 THEN
'NINE '
END, ' '
)
                      + COALESCE(
CASE
WHEN Units = 1
AND (
Hundreds > 0
OR Tens > 0
) THEN
'THOUSAND '
END,
CASE
WHEN Units = 2
AND (
Hundreds > 0
OR Tens > 0
) THEN
'MILLION '
END,
CASE
WHEN Units = 3
AND (
Hundreds > 0
OR Tens > 0
) THEN
'BILLION '
END,
CASE
WHEN Units = 4
AND (
Hundreds > 0
OR Tens > 0
) THEN
'TRILLION '
END, ' '),
                      ' '
                  )
    FROM @tblNumberGroups
    ORDER BY units DESC

    -- Get rid of all the spaces
    WHILE CHARINDEX('  ', @strReturn) > 0
    BEGIN
        SET @strReturn = REPLACE(@strReturn, '  ', ' ')
    END

    SET @strReturn = LTRIM(RTRIM(@strReturn))

    RETURN @strReturn
END

GO
----------------------------------********************************----------------------------------------

CREATE FUNCTION [dbo].[GetNumericToRupees] (@RUPEES AS DECIMAL(30, 2))
RETURNS VARCHAR(2000)
AS
BEGIN
    DECLARE @INNTBL_01 TABLE
    (
        RECNO INT IDENTITY(1, 1),
        MTEXT NVARCHAR(50)
    )

    DECLARE @INNTBL_02 TABLE
    (
        RECNO INT IDENTITY(1, 1),
        MTEXT NVARCHAR(50)
    )

    DECLARE @AMOUNT NUMERIC(38, 0)

    DECLARE @PAISE AS INT

    SET @AMOUNT = FLOOR(@RUPEES)

    SET @PAISE = CAST(CONVERT(DECIMAL(10, 0), (@RUPEES % 1) * 100) AS INT)


    --STEP 2:

    --NOW ADD UP THE SALT AND PEPPER ONTO TABLE  I.E. INSERT THE WORDS INTO IT

    INSERT INTO @INNTBL_01
    SELECT 'One '

    INSERT INTO @INNTBL_01
    SELECT 'Two '

    INSERT INTO @INNTBL_01
    SELECT 'Three '

    INSERT INTO @INNTBL_01
    SELECT 'Four '

    INSERT INTO @INNTBL_01
    SELECT 'Five '

    INSERT INTO @INNTBL_01
    SELECT 'Six '

    INSERT INTO @INNTBL_01
    SELECT 'Seven '

    INSERT INTO @INNTBL_01
    SELECT 'Eight '

    INSERT INTO @INNTBL_01
    SELECT 'Nine '

    INSERT INTO @INNTBL_01
    SELECT 'Ten '

    INSERT INTO @INNTBL_01
    SELECT 'Eleven '

    INSERT INTO @INNTBL_01
    SELECT 'Twelve '

    INSERT INTO @INNTBL_01
    SELECT 'Thirteen '

    INSERT INTO @INNTBL_01
    SELECT 'Fourteen '

    INSERT INTO @INNTBL_01
    SELECT 'Fifteen '

    INSERT INTO @INNTBL_01
    SELECT 'Sixteen '

    INSERT INTO @INNTBL_01
    SELECT 'Seventeen '

    INSERT INTO @INNTBL_01
    SELECT 'Eighteen '

    INSERT INTO @INNTBL_01
    SELECT 'Nineteen '

    INSERT INTO @INNTBL_01
    SELECT 'Twenty '

    -- SIMILARY, INSERT THE MULTIPLES

    INSERT INTO @INNTBL_02
    SELECT 'Ten '

    INSERT INTO @INNTBL_02
    SELECT 'Twenty '

    INSERT INTO @INNTBL_02
    SELECT 'Thirty '

    INSERT INTO @INNTBL_02
    SELECT 'Forty '

    INSERT INTO @INNTBL_02
    SELECT 'Fifty '

    INSERT INTO @INNTBL_02
    SELECT 'Sixty '

    INSERT INTO @INNTBL_02
    SELECT 'Seventy '

    INSERT INTO @INNTBL_02
    SELECT 'Eighty '

    INSERT INTO @INNTBL_02
    SELECT 'Ninety '

    --STEP 3:

    ----CHECK FOR THE LIMIT OF THE AMOUNT I.E. WHAT IS THE PLACE VALUE OF DIGITS -- LACS, THOUSANDS OR HUNDREDS

    DECLARE @WORD VARCHAR(2000)

    SELECT @WORD = ''

    DECLARE @M_AMT01 BigInt,
            @M_AMT02 BigInt

    IF @AMOUNT >= 10000000
    BEGIN

        SET @M_AMT01 = @AMOUNT

        SELECT @AMOUNT = (@AMOUNT % 10000000)



        SET @M_AMT01 = (@M_AMT01 - @AMOUNT) / 10000000

        DECLARE @WORD1 VARCHAR(300)

        SET @WORD1 = ''

        IF @M_AMT01 <= 20
           AND @M_AMT01 <> 0
        BEGIN

            SET @WORD1 =
            (
                SELECT @WORD1 + MTEXT FROM @INNTBL_01 WHERE RECNO = @M_AMT01
            )

        END

        SET @WORD = dbo.GetNumberToWords(@M_AMT01) + ' Crore '

    END

    IF @AMOUNT < 10000000
       AND @AMOUNT >= 100000
    BEGIN

        SET @M_AMT01 = @AMOUNT

        SELECT @AMOUNT = (@AMOUNT % 100000)

        SET @M_AMT01 = (@M_AMT01 - @AMOUNT) / 100000

        SET @WORD1 = ''

        IF @M_AMT01 < 100
           AND @M_AMT01 > 20
        BEGIN

            SET @M_AMT02 = @M_AMT01

            SET @M_AMT01 = (@M_AMT01 % 10)

            SET @M_AMT02 = (@M_AMT02 - @M_AMT01) / 10

            SET @WORD1 =
            (
                SELECT @WORD1 + MTEXT FROM @INNTBL_02 WHERE RECNO = @M_AMT02
            )

        END

        IF @M_AMT01 <= 20
           AND @M_AMT01 <> 0
        BEGIN

            SET @WORD1 =
            (
                SELECT @WORD1 + MTEXT FROM @INNTBL_01 WHERE RECNO = @M_AMT01
            )

        END

        SET @WORD = @WORD + @WORD1 + 'Lakh '

    END

    IF @AMOUNT < 100000
       AND @AMOUNT >= 1000
    BEGIN

        SET @M_AMT01 = @AMOUNT

        SET @AMOUNT = (@AMOUNT % 1000)

        SET @M_AMT01 = (@M_AMT01 - @AMOUNT) / 1000

        SET @WORD1 = ''

        IF @M_AMT01 < 100
           AND @M_AMT01 > 20
        BEGIN

            SET @M_AMT02 = @M_AMT01

            SET @M_AMT01 = (@M_AMT01 % 10)

            SET @M_AMT02 = (@M_AMT02 - @M_AMT01) / 10

            SET @WORD1 =
            (
                SELECT @WORD1 + MTEXT + '' FROM @INNTBL_02 WHERE RECNO = @M_AMT02
            )

        END

        IF @M_AMT01 <= 20
           AND @M_AMT01 <> 0
        BEGIN

            SET @WORD1 =
            (
                SELECT @WORD1 + MTEXT + '' FROM @INNTBL_01 WHERE RECNO = @M_AMT01
            )

        END

        SET @WORD = @WORD + @WORD1 + 'Thousand '

    END

    IF @AMOUNT < 1000
       AND @AMOUNT >= 100
    BEGIN

        SET @M_AMT01 = @AMOUNT

        SET @AMOUNT = (@AMOUNT % 100)

        SET @M_AMT01 = (@M_AMT01 - @AMOUNT) / 100

        SET @WORD =
        (
            SELECT @WORD + ' ' + MTEXT + 'Hundred ' FROM @INNTBL_01 WHERE RECNO = @M_AMT01
        )

    END

    IF @AMOUNT < 100
       AND @AMOUNT > 20
    BEGIN

        SET @M_AMT01 = @AMOUNT

        SET @AMOUNT = (@AMOUNT % 10)

        SET @M_AMT01 = (@M_AMT01 - @AMOUNT) / 10

        SET @WORD =
        (
            SELECT @WORD + MTEXT + '' FROM @INNTBL_02 WHERE RECNO = @M_AMT01
        )

    END

    IF @AMOUNT <= 20
       AND @AMOUNT >= 1
    BEGIN

        SET @WORD =
        (
            SELECT @WORD + MTEXT + '' FROM @INNTBL_01 WHERE RECNO = @AMOUNT
        )

    END


    SET @WORD = @WORD + ' '

    -- STEP 4:

    -- CALCULATE THE PAISE ALSO.

    DECLARE @WORDP VARCHAR(300)

    SET @WORDP = ''

    IF @PAISE <> 0
    BEGIN

        IF @PAISE < 100
           AND @PAISE > 20
        BEGIN

            DECLARE @PAISE_01 VARCHAR(300)

            SET @PAISE_01 = @PAISE

            SET @PAISE = (@PAISE % 10)

            SET @PAISE_01 = (@PAISE_01 - @PAISE) / 10

            SET @WORDP =
            (
                SELECT @WORDP + MTEXT FROM @INNTBL_02 WHERE RECNO = @PAISE_01
            )

        END

        IF @PAISE <= 20
           AND @PAISE >= 1
        BEGIN

            SET @WORDP =
            (
                SELECT @WORDP + MTEXT FROM @INNTBL_01 WHERE RECNO = @PAISE
            )

        END

        SET @WORD = @WORD + 'and ' + @WORDP + 'paisa'

    END

    IF @AMOUNT >= 1000000000
    BEGIN

        SET @WORD = ''

    END


    SELECT @WORD = REPLACE(@WORD COLLATE Latin1_General_BIN, '  ', ' ');

    Return UPPER(@WORD + ' ONLY')

END
------------------------------------
Go

SELECT  dbo.GetNumericToRupees(625)

Friday, 7 July 2017

Generate Class Object From SQL Table

declare @TableName sysname = 'TABLE_Name'
declare @result Nvarchar(max) = ''

select @result = @result + '
    private ' + ColumnType + ' ' + ' m_' + stuff(replace(ColumnName, '_', ''), 1, 1, lower(left(ColumnName, 1))) + ';'
from
(
    select
        replace(col.name, ' ', '_') ColumnName,
        column_id,
        case typ.name
            when 'bigint' then 'long'
            when 'binary' then 'byte[]'
            when 'bit' then 'bool'
            when 'char' then 'string'
            when 'date' then 'DateTime'
            when 'datetime' then 'DateTime'
            when 'datetime2' then 'DateTime'
            when 'datetimeoffset' then 'DateTimeOffset'
            when 'decimal' then 'decimal'
            when 'float' then 'float'
            when 'image' then 'byte[]'
            when 'int' then 'int'
            when 'money' then 'decimal'
            when 'nchar' then 'char'
            when 'ntext' then 'string'
            when 'numeric' then 'decimal'
            when 'nvarchar' then 'string'
            when 'real' then 'double'
            when 'smalldatetime' then 'DateTime'
            when 'smallint' then 'short'
            when 'smallmoney' then 'decimal'
            when 'text' then 'string'
            when 'time' then 'TimeSpan'
            when 'timestamp' then 'DateTime'
            when 'tinyint' then 'byte'
            when 'uniqueidentifier' then 'Guid'
            when 'varbinary' then 'byte[]'
            when 'varchar' then 'string'
            else 'UNKNOWN_' + typ.name
        end ColumnType
    from sys.columns col
        join sys.types typ on
            col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
    where object_id = object_id(@TableName)
) t
order by column_id

SET @result = @result + '
'

select @result = @result + '
    public ' + ColumnType + ' ' + ColumnName + ' { get { return m_' + stuff(replace(ColumnName, '_', ''), 1, 1, lower(left(ColumnName, 1))) + ';} set {m_' + stuff(replace(ColumnName, '_', ''), 1, 1, lower(left(ColumnName, 1))) + ' = value;} }' from
(
    select
        replace(col.name, ' ', '_') ColumnName,
        column_id,
        case typ.name
            when 'bigint' then 'long'
            when 'binary' then 'byte[]'
            when 'bit' then 'bool'
            when 'char' then 'string'
            when 'date' then 'DateTime'
            when 'datetime' then 'DateTime'
            when 'datetime2' then 'DateTime'
            when 'datetimeoffset' then 'DateTimeOffset'
            when 'decimal' then 'decimal'
            when 'float' then 'float'
            when 'image' then 'byte[]'
            when 'int' then 'int'
            when 'money' then 'decimal'
            when 'nchar' then 'char'
            when 'ntext' then 'string'
            when 'numeric' then 'decimal'
            when 'nvarchar' then 'string'
            when 'real' then 'double'
            when 'smalldatetime' then 'DateTime'
            when 'smallint' then 'short'
            when 'smallmoney' then 'decimal'
            when 'text' then 'string'
            when 'time' then 'TimeSpan'
            when 'timestamp' then 'DateTime'
            when 'tinyint' then 'byte'
            when 'uniqueidentifier' then 'Guid'
            when 'varbinary' then 'byte[]'
            when 'varchar' then 'string'
            else 'UNKNOWN_' + typ.name
        end ColumnType
    from sys.columns col
        join sys.types typ on
            col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
    where object_id = object_id(@TableName)
) t
order by column_id


SELECT CONVERT(NTEXT,@result)

Get all non-clustered indexes

DECLARE cIX CURSOR FOR     SELECT OBJECT_NAME(SI.Object_ID), SI.Object_ID, SI.Name, SI.Index_ID         FROM Sys.Indexes SI             ...