我正在使用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();
因此,如您所见,我有两个不同的数组,首先得到子类别名称:
以及表RedMarkItems的所有列:
我想做的是动态创建列,这是说,如果subcategorieName不存在,因为RedMarkItems中的列会进行更新并以某种方式创建它:
var createColumn = db.ExeSQL($"ALTER TABLE RedMarkItems ADD {ColumnName} BIT");
如果SubcategorieName作为RedMarkItems表中的列不存在,如何比较?然后创建列作为我的查询?问候
答案 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默认值等)?如您所见,所有这些信息都非常重要,需要在代码中的某个位置进行定义。