2

We are working on MS SQL database to backup the ddl of database tables. We have written below script to generate ddl from MS SQL referred from post . Script to generate DDL is :

DECLARE @table_name SYSNAME
        SELECT @table_name = 'dbo.deal'
        DECLARE 
              @object_name SYSNAME
            , @object_id INT
        SELECT 
              @object_name = '[' + s.name + '].[' + o.name + ']'
            , @object_id = o.[object_id]
        FROM sys.objects o WITH (NOWAIT)
        JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id]
        WHERE s.name + '.' + o.name = @table_name
            AND o.[type] = 'U'
            AND o.is_ms_shipped = 0

        DECLARE @SQL NVARCHAR(MAX) = ''

        ;WITH index_column AS 
        (
            SELECT 
                  ic.[object_id]
                , ic.index_id
                , ic.is_descending_key
                , ic.is_included_column
                , c.name
            FROM sys.index_columns ic WITH (NOWAIT)
            JOIN sys.columns c WITH (NOWAIT) ON ic.[object_id] = c.[object_id] AND ic.column_id = c.column_id
            WHERE ic.[object_id] = @object_id
        ),
        fk_columns AS 
        (
             SELECT 
                  k.constraint_object_id
                , cname = c.name
                , rcname = rc.name
            FROM sys.foreign_key_columns k WITH (NOWAIT)
            JOIN sys.columns rc WITH (NOWAIT) ON rc.[object_id] = k.referenced_object_id AND rc.column_id = k.referenced_column_id 
            JOIN sys.columns c WITH (NOWAIT) ON c.[object_id] = k.parent_object_id AND c.column_id = k.parent_column_id
            WHERE k.parent_object_id = @object_id
        )
        SELECT @SQL = 'CREATE TABLE ' + @object_name + CHAR(13) + '(' + CHAR(13) + STUFF((
            SELECT CHAR(9) + ', [' + c.name + '] ' + 
                CASE WHEN c.is_computed = 1
                    THEN 'AS ' + cc.[definition] 
                    ELSE '[' + tp.name + ']' + 
                        CASE WHEN tp.name IN ('varchar', 'char', 'varbinary', 'binary')
                               THEN '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR(5)) END + ')'
                             WHEN tp.name IN ('nvarchar', 'nchar')
                               THEN '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length / 2 AS VARCHAR(5)) END + ')'
                             WHEN tp.name IN ('datetime2', 'time2', 'datetimeoffset') 
                               THEN '(' + CAST(c.scale AS VARCHAR(5)) + ')'
                             WHEN tp.name IN ('decimal','numeric') 
                               THEN '(' + CAST(c.[precision] AS VARCHAR(5)) + ',' + CAST(c.scale AS VARCHAR(5)) + ')'
                            ELSE ''
                        END +  
                        CASE WHEN ic.is_identity = 1 THEN ' IDENTITY(' + CAST(ISNULL(ic.seed_value, '0') AS CHAR(1)) + ',' + CAST(ISNULL(ic.increment_value, '1') AS CHAR(1)) + ')' ELSE '' END + 
                        CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END +
                        CASE WHEN dc.[definition] IS NOT NULL THEN ' DEFAULT' + dc.[definition] ELSE '' END                
                END + CHAR(13)
            FROM sys.columns c WITH (NOWAIT)
            JOIN sys.types tp WITH (NOWAIT) ON c.user_type_id = tp.user_type_id
            LEFT JOIN sys.computed_columns cc WITH (NOWAIT) ON c.[object_id] = cc.[object_id] AND c.column_id = cc.column_id
            LEFT JOIN sys.default_constraints dc WITH (NOWAIT) ON c.default_object_id != 0 AND c.[object_id] = dc.parent_object_id AND c.column_id = dc.parent_column_id
            LEFT JOIN sys.identity_columns ic WITH (NOWAIT) ON c.is_identity = 1 AND c.[object_id] = ic.[object_id] AND c.column_id = ic.column_id
            WHERE c.[object_id] = @object_id
            ORDER BY c.column_id
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, CHAR(9) + ' ')
            + ISNULL((SELECT CHAR(9) + ', CONSTRAINT [' + k.name + '] PRIMARY KEY CLUSTERED (' + 
                            (SELECT STUFF((
                                 SELECT ', [' + c.name + '] ' + CASE WHEN ic.is_descending_key = 1 THEN 'DESC' ELSE 'ASC' END
                                 FROM sys.index_columns ic WITH (NOWAIT)
                                 JOIN sys.columns c WITH (NOWAIT) ON c.[object_id] = ic.[object_id] AND c.column_id = ic.column_id
                                 WHERE ic.is_included_column = 0
                                     AND ic.[object_id] = k.parent_object_id 
                                     AND ic.index_id = k.unique_index_id     
                                 FOR XML PATH(N''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ''))
                    + ')' + CHAR(13)
                    FROM sys.key_constraints k WITH (NOWAIT)
                    WHERE k.parent_object_id = @object_id 
                        AND k.[type] = 'PK'), '') + ')'  + CHAR(13)

        PRINT @SQL; SELECT @SQL;

Now we are getting issue with this script.

This working fine with Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Service Pack 2. But with SQL server 11.0.6523 (2012) version, it missing one column from table.

Same query script generating different result for different version of SQL Server.

DDL Script generated from SQL Server Management studio is :

USE [DealTrackPF]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[deal](
    [deal_id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [cl_id] [numeric](18, 0) NULL,
    [st_id] [numeric](18, 0) NULL,
    [sec_id] [int] NULL,
    [desc] [varchar](400) NULL,
    [date_added] [datetime] NULL,
    [deal_number_old] [numeric](18, 0) NULL,
    [st_date] [datetime] NULL,
    [p_date] [datetime] NULL,
    [remarks] [varchar](2000) NULL,
    [desi_id] [numeric](18, 0) NULL,
    **[deal_number] [numeric](18, 0) NULL**,
    [x_no] [varchar](9) NULL,
    [pro_id] [numeric](18, 0) NULL,
    [u_revenue] [money] NULL,
    [r_fee] [money] NULL,
    [my_points] [numeric](5, 2) NULL,
    [dms_deal_number] [varchar](15) NULL,
    [assignee] [varchar](200) NULL,
    [last_updated] [timestamp] NOT NULL,
    [pf_deal] [int] NULL,
    [email_sent] [datetime] NULL,
    [com_id] [int] NULL,
    [c_approval] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[deal] ADD [my_contacts] [varchar](200) NULL
ALTER TABLE [dbo].[deal] ADD [my_status] [varchar](50) NULL
SET ANSI_PADDING ON
ALTER TABLE [dbo].[deal] ADD [r_ex] [int] NULL
ALTER TABLE [dbo].[deal] ADD [r_exceeds] [int] NULL
CONSTRAINT [PK_DEAL] PRIMARY KEY CLUSTERED 
(
    [deal_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

When running script on above ddl on SQL server SP3 11.0.6523 2012, it skipping deal_number column.

What can be the cause of skipping some column using the script given above for different database versions on different machine?

Community
  • 1
  • 1
Neelam Sharma
  • 2,745
  • 4
  • 32
  • 73

0 Answers0