Click here to Skip to main content
15,887,083 members
Articles / Database Development / SQL Server / SQL Server 2008

Library for scripting SQL Server database objects with examples

Rate me:
Please Sign up or sign in to vote.
4.93/5 (138 votes)
8 Nov 2011CPOL13 min read 231.9K   13.3K   252  
This article is about library for scripting SQL Server database objects and examples representing how this library can be used.
using System.Collections.Generic;
using System.Text;
using System;

namespace ObjectHelper.DBObjectType
{
    public class UserDefinedTableType : BaseDbObject
    {
        public string Schema { get; set; }

        public List<UserDefinedTableTypeColumn> Columns { get; set; }

        public List<UserDefinedTableTypeIndex> Indexes { get; set; }

        public List<UserDefinedTableTypeCheckConstraint> CheckConstraints { get; set; }

        public UserDefinedTableType()
        {
            Columns = new List<UserDefinedTableTypeColumn>();
            Indexes = new List<UserDefinedTableTypeIndex>();
            CheckConstraints = new List<UserDefinedTableTypeCheckConstraint>();
        }

        public string Script(ScriptingOptions so)
        {
            var sbScript = new StringBuilder();
            sbScript.Append("CREATE TYPE [" + Schema + "].["+Name+"] AS TABLE(" + Environment.NewLine);
            for (int i = 0; i < Columns.Count; i++)
            {
                sbScript.Append("\t["+Columns[i].Name + "] ");

                if (!Columns[i].IsComputed)
                {
                    switch (Columns[i].DataType.ToUpper())
                    {
                        case "IMAGE":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "TEXT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "UNIQUEIDENTIFIER":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "DATE":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "TIME":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Scale + ") ");
                            }
                            break;
                        case "DATETIME2":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Scale + ") ");
                            }
                            break;
                        case "DATETIMEOFFSET":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Scale + ") ");
                            }
                            break;
                        case "TINYINT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "SMALLINT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "REAL":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "MONEY":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "DATETIME":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "SMALLDATETIME":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "INT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "FLOAT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "SQL_VARIANT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "NTEXT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "BIT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "DECIMAL":
                            sbScript.Append("[" + Columns[i].DataType + "]" + " (" + Columns[i].Precision + "," + Columns[i].Scale + ") ");
                            break;
                        case "NUMERIC":
                            sbScript.Append("[" + Columns[i].DataType + "]" + " (" + Columns[i].Precision + "," + Columns[i].Scale + ") ");
                            break;
                        case "SMALLMONEY":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "BIGINT":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "HIERARCHYID":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "GEOMETRY":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "GEOGRAPHY":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        case "VARBINARY":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Length + ") ");
                            }
                            break;
                        case "VARCHAR":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Length + ") ");
                            }
                            break;
                        case "BINARY":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Length + ") ");
                            }
                            break;
                        case "CHAR":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Length + ") ");
                            }
                            break;
                        case "TIMESTAMP":
                            sbScript.Append("[" + Columns[i].DataType + "]" + " ");
                            break;
                        case "NVARCHAR":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Length + ") ");
                            }
                            break;
                        case "NCHAR":
                            if (Columns[i].Precision == -1)
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(max) ");
                            }
                            else
                            {
                                sbScript.Append("[" + Columns[i].DataType + "]" + "(" + Columns[i].Length + ") ");
                            }
                            break;
                        case "XML":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            if (Columns[i].IsColumnSet)
                            {
                                sbScript.Append(" COLUMN_SET FOR ALL_SPARSE_COLUMNS ");
                            }
                            break;
                        case "SYSNAME":
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                        default:
                            sbScript.Append("[" + Columns[i].DataType + "] ");
                            break;
                    }
                }
                else
                { 
                    sbScript.Append(" AS " + Columns[i].Definition);
                    if (Columns[i].IsPersisted)
                    {
                        sbScript.Append(" PERSISTED ");
                    }
                }
                if (Columns[i].Identity)
                {
                    sbScript.Append("IDENTITY("+ Columns[i].IdentitySeed+","+ Columns[i].IdentityIncrement +")");
                }
                if (Columns[i].IsRowGuidCol)
                {
                    sbScript.Append(" ROWGUIDCOL ");
                }

                if (!Columns[i].IsNullable)
                {
                    sbScript.Append(" NOT NULL");
                }

                if (Columns[i].DefaultValue != "")
                {
                    sbScript.Append(" DEFAULT " + Columns[i].DefaultValue);
                }

                if (i != Columns.Count - 1)
                {
                    sbScript.Append(",");
                }
                else
                {
                    if (Indexes.Count > 0 || CheckConstraints.Count > 0)
                    {
                        sbScript.Append(",");
                    }
                }

                
                sbScript.AppendLine();
            }
            for (int i = 0; i < Indexes.Count; i++)
            {
                if (Indexes[i].IsPrimaryKey)
                {
                    sbScript.Append("\tPRIMARY KEY ");
                }else if (Indexes[i].IsUnique)
                {
                    sbScript.Append("\tUNIQUE ");
                }
                sbScript.Append(Indexes[i].TypeDescription + Environment.NewLine);
                sbScript.Append("\t(" + Environment.NewLine);
                for (var j = 0; j < Indexes[i].Columns.Count; j++)
                {
                    sbScript.Append("\t\t[" + Indexes[i].Columns[j].Name+"]");
                    sbScript.Append(Indexes[i].Columns[j].IsDescendingKey ? " DESC" : " ASC");
                    if (j != Indexes[i].Columns.Count - 1)
                    {
                        sbScript.Append(",");
                    }
                    sbScript.Append(Environment.NewLine);
                }
                sbScript.Append("\t)");
                sbScript.Append(Indexes[i].IgnoreDupKey ? "WITH (IGNORE_DUP_KEY = ON)" : "WITH (IGNORE_DUP_KEY = OFF)");
                if (i != Indexes.Count - 1)
                {
                    sbScript.Append(",");
                }
                else
                {
                    if (CheckConstraints.Count > 0)
                    {
                        sbScript.Append(",");
                    }
                }
                
                sbScript.AppendLine();
            }
            for (int i = 0; i < CheckConstraints.Count; i++)
            {
                sbScript.Append("\tCHECK ("+CheckConstraints[i].Definition+")");
                if (i != CheckConstraints.Count - 1)
                {
                    sbScript.Append(",");
                }
                sbScript.AppendLine();
            }
            sbScript.Append(")");
            
            return sbScript.ToString();
        
        }
    }

    public class UserDefinedTableTypeCheckConstraint :BaseDbObject
    {
        public int ParentObjectId { get; set; }
        public string Definition { get; set; }
    }

    public class UserDefinedTableTypeColumn:BaseDbObject
    {
        public int ColumnId { get; set; }
        public bool IsNullable { get; set; }
        public bool IsComputed { get; set; }
        public bool IsRowGuidCol { get; set; }
        public bool IsFullTextIndexed { get; set; }
        public bool IsPersisted { get; set; }
        public string Collation { get; set; }
        public bool Identity { get; set; }
        public int IdentitySeed { get; set; }
        public int IdentityIncrement { get; set; }
        public string DefaultValue { get; set; }
        public bool IsFileStream { get; set; }
        public bool IsSparse { get; set; }
        public string DataType { get; set; }
        public int Length { get; set; }
        public int Precision { get; set; }
        public int Scale { get; set; }
        public string Definition { get; set; }
        public bool IsColumnSet { get; set; }
        public int DataTypeId { get; set; }
    }

    public class UserDefinedTableTypeIndex:BaseDbObject
    {
        public int IndexId { get; set; }
        public string TypeDescription { get; set; }
        public bool IsUnique { get; set; }
        public bool IsPrimaryKey { get; set; }
        public bool IgnoreDupKey { get; set; }
        public string FilterDefinition { get; set; }

        public List<IndexColumn> Columns { get; set; }
        public UserDefinedTableTypeIndex()
        {
            Columns = new List<IndexColumn>();
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Marwin Cassovia Soft
Slovakia Slovakia
My name is Robert Kanasz and I have been working with ASP.NET, WinForms and C# for several years.
MCSD - Web Applications
MCSE - Data Platform
MCPD - ASP.NET Developer 3.5
- Web Developer 4
MCITP - Database Administrator 2008
- Database Developer 2008
MCSA - SQL Server 2012
MCTS - .NET Framework 3.5, ASP.NET Applications
- SQL Server 2008, Database Development
- SQL Server 2008, Implementation and Maintenance
- .NET Framework 4, Data Access
- .NET Framework 4, Service Communication Applications
- .NET Framework 4, Web Applications
MS - Programming in HTML5 with JavaScript and CSS3 Specialist

Open source projects: DBScripter - Library for scripting SQL Server database objects


Please, do not forget vote

Comments and Discussions