Saltar al contenido

Crear una tabla de SQL Server a partir de una tabla de datos de C #

Estuvimos investigado en diferentes espacios y así de este modo traerte la respuesta a tu duda, si tienes alguna inquietud deja tu inquietud y te contestamos porque estamos para ayudarte.

Solución:

public static string CreateTABLE(string tableName, DataTable table)

    string sqlsc;
    sqlsc = "CREATE TABLE " + tableName + "(";
    for (int i = 0; i < table.Columns.Count; i++)
    
        sqlsc += "n [" + table.Columns[i].ColumnName + "] ";
        string columnType = table.Columns[i].DataType.ToString();
        switch (columnType)
        
            case "System.Int32":
                sqlsc += " int ";
                break;
            case "System.Int64":
                sqlsc += " bigint ";
                break;
            case "System.Int16":
                sqlsc += " smallint";
                break;
            case "System.Byte":
                sqlsc += " tinyint";
                break;
            case "System.Decimal":
                sqlsc += " decimal ";
                break;
            case "System.DateTime":
                sqlsc += " datetime ";
                break;
            case "System.String":
            default:
                sqlsc += string.Format(" nvarchar(0) ", table.Columns[i].MaxLength == -1 ? "max" : table.Columns[i].MaxLength.ToString());
                break;
        
        if (table.Columns[i].AutoIncrement)
            sqlsc += " IDENTITY(" + table.Columns[i].AutoIncrementSeed.ToString() + "," + table.Columns[i].AutoIncrementStep.ToString() + ") ";
        if (!table.Columns[i].AllowDBNull)
            sqlsc += " NOT NULL ";
        sqlsc += ",";
    
    return sqlsc.Substring(0,sqlsc.Length-1) + "n)";

Es un poco inusual en SQL crear tablas a partir de una definición proporcionada por el cliente de un objeto Datatable. Las tablas son entidades cuidadosamente elaboradas en SQL, con la consideración de la ubicación del tiempo de implementación para elegir el disco adecuado, con la consideración de indexación en el momento del diseño y con todos los problemas involucrados en el modelado adecuado de una base de datos.

Será mejor que explique lo que está tratando de lograr para que entendamos qué consejo dar.

Como nota al margen, en SQL 2008 hay una manera muy fácil de crear una tabla a partir de una tabla de datos definida por el cliente: pasar la tabla de datos como un parámetro de valor de tabla, luego emitir un SELECT * INTO FROM @tvp, esto transferirá efectivamente la definición de la tabla de datos y sus datos de contenido en una tabla real en SQL.

Sé que esta pregunta es bastante antigua, pero tenía algo muy similar que necesitaba escribir. Tomé lo que hice y modifiqué los ejemplos proporcionados por Amin y rasputino y creé un ejemplo que generará solo el SQL. Agregué algunas características y evité la concatenación para ayudar a mejorar un proceso que es inherentemente de bajo rendimiento.

/// 
/// Inspects a DataTable and return a SQL string that can be used to CREATE a TABLE in SQL Server.
/// 
/// System.Data.DataTable object to be inspected for building the SQL CREATE TABLE statement.
/// String of SQL
public static string GetCreateTableSql(DataTable table)

    StringBuilder sql = new StringBuilder();
    StringBuilder alterSql = new StringBuilder();

    sql.AppendFormat("CREATE TABLE [0] (", table.TableName);

    for (int i = 0; i < table.Columns.Count; i++)
    
        bool isNumeric = false;
        bool usesColumnDefault = true;

        sql.AppendFormat("nt[0]", table.Columns[i].ColumnName);

        switch (table.Columns[i].DataType.ToString().ToUpper())
        
            case "SYSTEM.INT16":
                sql.Append(" smallint");
                isNumeric = true;
                break;
            case "SYSTEM.INT32":
                sql.Append(" int");
                isNumeric = true;
                break;
            case "SYSTEM.INT64":
                sql.Append(" bigint");
                isNumeric = true;
                break;
            case "SYSTEM.DATETIME":
                sql.Append(" datetime");
                usesColumnDefault = false;
                break;
            case "SYSTEM.STRING":
                sql.AppendFormat(" nvarchar(0)", table.Columns[i].MaxLength);
                break;
            case "SYSTEM.SINGLE":
                sql.Append(" single");
                isNumeric = true;
                break;
            case "SYSTEM.DOUBLE":
                sql.Append(" double");
                isNumeric = true;
                break;
            case "SYSTEM.DECIMAL":
                sql.AppendFormat(" decimal(18, 6)");
                isNumeric = true;
                break;
            default:
                sql.AppendFormat(" nvarchar(0)", table.Columns[i].MaxLength);
                break;
        

        if (table.Columns[i].AutoIncrement)
        
            sql.AppendFormat(" IDENTITY(0,1)", 
                table.Columns[i].AutoIncrementSeed, 
                table.Columns[i].AutoIncrementStep);
        
        else
        
            // DataColumns will add a blank DefaultValue for any AutoIncrement column. 
            // We only want to create an ALTER statement for those columns that are not set to AutoIncrement. 
            if (table.Columns[i].DefaultValue != null)
            
                if (usesColumnDefault)
                
                    if (isNumeric)
                    
                        alterSql.AppendFormat("nALTER TABLE 0 ADD CONSTRAINT [DF_0_1]  DEFAULT (2) FOR [1];", 
                            table.TableName, 
                            table.Columns[i].ColumnName, 
                            table.Columns[i].DefaultValue);
                    
                    else
                    
                        alterSql.AppendFormat("nALTER TABLE 0 ADD CONSTRAINT [DF_0_1]  DEFAULT ('2') FOR [1];", 
                            table.TableName, 
                            table.Columns[i].ColumnName, 
                            table.Columns[i].DefaultValue);
                    
                
                else
                
                    // Default values on Date columns, e.g., "DateTime.Now" will not translate to SQL.
                    // This inspects the caption for a simple XML string to see if there is a SQL compliant default value, e.g., "GETDATE()".
                    try
                    
                        System.Xml.XmlDocument xml = new System.Xml.XmlDocument();

                        xml.LoadXml(table.Columns[i].Caption);

                        alterSql.AppendFormat("nALTER TABLE 0 ADD CONSTRAINT [DF_0_1]  DEFAULT (2) FOR [1];", 
                            table.TableName, 
                            table.Columns[i].ColumnName, 
                            xml.GetElementsByTagName("defaultValue")[0].InnerText);
                    
                    catch
                    
                        // Handle
                    
                
            
        

        if (!table.Columns[i].AllowDBNull)
        
            sql.Append(" NOT NULL");
        

        sql.Append(",");
    

    if (table.PrimaryKey.Length > 0)
    
        StringBuilder primaryKeySql = new StringBuilder();

        primaryKeySql.AppendFormat("ntCONSTRAINT PK_0 PRIMARY KEY (", table.TableName);

        for (int i = 0; i < table.PrimaryKey.Length; i++)
        
            primaryKeySql.AppendFormat("0,", table.PrimaryKey[i].ColumnName);
        

        primaryKeySql.Remove(primaryKeySql.Length - 1, 1);
        primaryKeySql.Append(")");

        sql.Append(primaryKeySql);
    
    else
    
        sql.Remove(sql.Length - 1, 1);
    

    sql.AppendFormat("n);n0", alterSql.ToString());

    return sql.ToString();

Aquí hay una prueba simple para usar este método y obtener el SQL:

DataTable table = new DataTable("Users");

table.Columns.Add(new DataColumn()

    ColumnName = "UserId",
    DataType = System.Type.GetType("System.Int32"),
    AutoIncrement = true,
    AllowDBNull = false,
    AutoIncrementSeed = 1,
    AutoIncrementStep = 1
);

table.Columns.Add(new DataColumn()

    ColumnName = "UserName",
    DataType = System.Type.GetType("System.String"),
    AllowDBNull = true,
    DefaultValue = String.Empty,
    MaxLength = 50
);

table.Columns.Add(new DataColumn()

    ColumnName = "LastUpdate",
    DataType = System.Type.GetType("System.DateTime"),
    AllowDBNull = false,
    DefaultValue = DateTime.Now, 
    Caption = "GETDATE()"
);

table.PrimaryKey = new DataColumn[]  table.Columns[0] ;

string sql = DataHelper.GetCreateTableSql(table);

Console.WriteLine(sql);

Y finalmente, la salida:

CREATE TABLE [Users] (
    [UserId] int IDENTITY(0,1) NOT NULL,
    [UserName] nvarchar(50),
    [LastUpdate] datetime NOT NULL,
    CONSTRAINT PK_Users PRIMARY KEY (UserId)
);

ALTER TABLE Users ADD CONSTRAINT [DF_Users_UserName]  DEFAULT ('') FOR [UserName];
ALTER TABLE Users ADD CONSTRAINT [DF_Users_LastUpdate]  DEFAULT (GETDATE()) FOR[LastUpdate];

Estoy de acuerdo con la respuesta original que establece que la gestión de datos no es algo que deba hacerse al azar. De hecho, se requiere mucho pensamiento para mantener la base de datos funcionando sin problemas y permitiendo su mantenimiento en el futuro. Pero hay ocasiones en las que es necesaria una solución de codificación y espero que esto pueda ayudar a alguien.

Te mostramos reseñas y calificaciones

Puedes añadir valor a nuestra información asistiendo con tu veteranía en las ilustraciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *