从另一个表动态创建列

时间:2018-12-31 17:11:10

标签: c# linq

我正在使用TSQL和C#。我有两个返回字符串的查询:

string[] allSubcategories = dt.AsEnumerable().Select(x => x.Field<string>("SubcategoryName")).Distinct().ToArray();

   var redMark = db.GetTableBySQL("SELECT * FROM RedMarkItems");
string[] redMarkColumns = redMark.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToArray();

因此,如您所见,我有两个不同的数组,首先得到子类别名称:

enter image description here

以及表RedMarkItems的所有列:

enter image description here

我想做的是动态创建列,这是说,如果subcategorieName不存在,因为RedMarkItems中的列会进行更新并以某种方式创建它:

  var createColumn = db.ExeSQL($"ALTER TABLE RedMarkItems ADD {ColumnName} BIT");

如果SubcategorieName作为RedMarkItems表中的列不存在,如何比较?然后创建列作为我的查询?问候

1 个答案:

答案 0 :(得分:2)

如果您想知道使用Linq方法在已填充的DataTable中是否存在特定的列,那么它就是:

bool exists = redMark.Columns.Cast<DataColumn>().Any(x => x.ColumnName == "SubCategoryName");

相反,如果您想直接向数据库询问此信息,请使用INFORMATION_SCHEMA视图Columns视图是用于此类查询的视图。

string query = @"IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.Column 
                           WHERE Column_Name = @colName) 
                    SELECT 1 ELSE SELECT 0";
SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.Add("@colName", SqlDbType.NVarChar).Value = "SubCategoryName";
bool exists = (cmd.ExecuteScalar() == 1);

现在,关于创建列的部分本身就很简单。它只是一个合适的ALTER TABLE。但是,还有很多事情需要清除。新列的数据类型是什么?它的长度和精度如何?将对其施加哪些约束(Null / Not Null默认值等)?如您所见,所有这些信息都非常重要,需要在代码中的某个位置进行定义。