C#操作SQLSERVER同一个数据库,其中一个表 的多行数据保存到表结构不一致的另一个表里
时间: 2024-12-22 08:12:12 浏览: 4
C#连接SQLServer修改数据表结构
在C#中,如果你需要将一个SQL Server数据库中结构不一致的表里的多行数据迁移到另一个表,通常可以采用存储过程、临时表或者直接使用ADO.NET访问数据库。这里提供一种基本思路:
1. **存储过程**:
- 创建一个存储过程,接收源表的查询结果作为输入(例如:`@SourceTable table variable`),然后根据目标表的结构动态插入数据。这可以通过`sp_executesql`或T-SQL的`UNION ALL`等来完成。
```sql
CREATE PROCEDURE MigrateData
AS
BEGIN
SET NOCOUNT ON;
-- 根据源表和目标表结构动态创建INSERT语句
DECLARE @InsertSql NVARCHAR(MAX) = '';
SELECT @InsertSql += 'INSERT INTO TargetTable (Column1, Column2) VALUES (' + COLUMN_NAME + ', ' + COLUMN_NAME + '), ' FROM SourceTable.columns;
-- 删除最后多余的逗号
SET @InsertSql = LEFT(@InsertSql, LEN(@InsertSql) - 2);
EXEC (@InsertSql);
END;
```
2. **临时表**:
- 先查询源表的数据到一个临时表中,然后根据临时表的内容填充目标表。
```csharp
using (SqlConnection connection = new SqlConnection(connectionString))
{
string sourceQuery = "SELECT * FROM SourceTable";
SqlCommand command = new SqlCommand(sourceQuery, connection);
connection.Open();
string createTempTableSql = $"CREATE TABLE #TempTable AS {sourceQuery}";
command.ExecuteNonQuery();
// 然后再将临时表的数据插入目标表
string insertIntoTargetTableSql = "INSERT INTO TargetTable SELECT * FROM #TempTable";
command.ExecuteNonQuery();
command.CommandText = createTempTableSql;
command.ExecuteNonQuery(); // Drop the temporary table after use
}
```
3. **ADO.NET直接操作**:
- 使用DataTable或者DataSet来暂存源表数据,然后遍历并插入到目标表。
```csharp
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM SourceTable", connection);
DataTable sourceTable = new DataTable();
adapter.Fill(sourceTable);
foreach (DataRow row in sourceTable.Rows)
{
// 根据目标表的列映射,构造insert语句
string insertSql = "INSERT INTO TargetTable (Column1, Column2) VALUES (@Value1, @Value2)";
SqlCommand command = new SqlCommand(insertSql, connection);
command.Parameters.AddWithValue("@Value1", row["Column1"]);
command.Parameters.AddWithValue("@Value2", row["Column2"]);
command.ExecuteNonQuery();
}
}
```
阅读全文