为任何给定的SQL Server表选择除第一列之外的所有列

问题描述 投票:1回答:2

我在C#中有这个代码,但我需要它来选择除表的第一列(标识列)之外的所有列,这样当我将数据插入到不同数据库中的相同表中时,目标数据库会分配它自己的标识列值:

SqlCommand commandSourceData = new SqlCommand($"SELECT * FROM dbo.{tableName};", sourceConnection);
SqlDataReader reader = commandSourceData.ExecuteReader();

有没有办法做到这一点?

c# sql-server sqlbulkcopy
2个回答
4
投票

如果您想为数据库中的每个列提供通用解决方案,则可以使用此类代码

public string GetColumnsWithoutIdentity(string tableName, SqlConnection con)
{
    SqlDataAdapter da = new SqlDataAdapter($"SELECT * FROM dbo.{tableName} where 1=0", con);
    DataTable dt = new DataTable();
    da.FillSchema(dt, SchemaType.Source);
    var cols = dt.Columns.Cast<DataColumn>().Where(x => !x.AutoIncrement).Select(x => x.ColumnName);
    return string.Join(",", cols);
}

现在,您可以使用返回的字符串构建不带autoincrement列的Sql语句。 请注意,此代码易受Sql注入攻击。您应该完全确定用于构建第一个查询的tableName参数不是由您的用户直接键入的。让它从预定义表的白名单(只读)中进行选择(这也不是100%安全)

另一个缺点是你需要两次点击数据库。一旦获得具有关于AutoIncrement列的信息的模式,并在此之后填充数据表。

© www.soinside.com 2019 - 2024. All rights reserved.