Select 除任何给定 SQL 服务器的第一列之外的所有列 table

Select all columns except the first column for any given SQL Server table

我在 C# 中有这段代码,但我需要它 select 除了 table 的第一列(标识列)之外的所有列,这样当我将数据插入到在不同的数据库中相同 table,目标数据库分配其自己的标识列值:

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

有办法吗?

如果您希望为数据库中的每一列提供通用解决方案,您可以使用这种代码

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);
}

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

另一个缺点是您需要访问数据库两次。一次获取包含有关 AutoIncrement 列的信息的模式,然后一次填充数据表。