Seleziona tutte le colonne tranne la prima colonna per qualsiasi tabella di SQL Server specificata

c# sqlbulkcopy sql-server

Domanda

Ho questo codice in C #, ma ho bisogno di selezionare tutte le colonne TRANNE la prima colonna della tabella (la colonna Identity), in modo che quando inserisco i dati in una tabella identica in un database diverso, il database di destinazione assegna il proprio valori delle colonne di identità:

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

C'è un modo per fare questo?

Risposta accettata

Se vuoi una soluzione generica per ogni colonna del tuo database puoi usare questo tipo di codice

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

Ora è possibile utilizzare la stringa restituita per creare un'istruzione Sql senza la colonna autoincrement.
Si noti che questo codice è vulnerabile a Sql Injection. Dovresti essere assolutamente sicuro che il parametro tableName utilizzato per creare la prima query non sia stato digitato direttamente dall'utente. Lascia che scelga da una whitelist (readonly) di tabelle predefinite (e anche questo non è sicuro al 100%)

Un altro inconveniente è il fatto che è necessario colpire il database due volte. Una volta per ottenere lo schema con le informazioni sulla colonna di AutoIncrement e uno per riempire il datatable dopo.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow