주어진 SQL Server 테이블의 첫 번째 열을 제외한 모든 열 선택

c# sqlbulkcopy sql-server

문제

C #에서이 코드가 있지만 다른 데이터베이스의 동일한 테이블에 데이터를 삽입 할 때 대상 데이터베이스가 자체 테이블을 할당하도록 테이블의 첫 번째 열 (ID 열)을 제외한 모든 열을 선택해야합니다. 식별 컬럼 값 :

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

이제 반환 된 문자열을 사용하여 autoincrement 열이없는 Sql 문을 작성할 수 있습니다.
이 코드는 Sql Injection에 취약합니다. 첫 번째 쿼리를 작성하는 데 사용 된 tableName 매개 변수가 사용자가 직접 입력하지 않았는지 반드시 확인해야합니다. 사전 정의 된 표의 화이트리스트 (읽기 전용)에서 선택하게하십시오 (또한 이것은 100 % 안전하지 않습니다)

또 다른 단점은 데이터베이스에 두 번 도달해야한다는 사실입니다. 일단 AutoIncrement 열에 대한 정보가있는 스키마를 가져오고 그 다음에 데이터 테이블을 채우십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.