首页 > 解决方案 > 从另一个表动态创建列

问题描述

我正在使用 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();

所以,你可以看到我有两个不同的数组,首先我得到 subcategoriesNames:

在此处输入图像描述

以及表 RedMarkItems 的所有列:

在此处输入图像描述

我想做的是动态创建列,我的意思是,如果 subcategorieName 作为 RedMarkItems 中的列不存在,请执行更新并创建它,例如:

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

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

标签: c#linq

解决方案


如果您想知道使用 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 默认值等)?正如您所看到的,所有这些信息都非常重要,需要在代码中的某个位置进行定义。


推荐阅读