SQL Server 大数据复制到另一张表

在日常的数据库操作中,我们经常需要将一个表中的数据复制到另一个表中,这在数据分析、数据备份等场景下非常常见。本文将介绍如何使用 SQL Server 将一个表中的大量数据复制到另一个表中,同时提供相应的代码示例。

1. 创建目标表

首先,我们需要在数据库中创建一个目标表,用于存储要复制的数据。

CREATE TABLE DestinationTable (
    ID INT PRIMARY KEY,
    Name VARCHAR(100),
    Age INT,
    Email VARCHAR(100)
);

上述代码创建了一个名为 DestinationTable 的表,包含了四个列:IDNameAgeEmail。其中,ID 列作为主键。

2. 复制数据

2.1 使用 INSERT INTO 语句

最简单的方法是使用 INSERT INTO 语句,将源表中的数据插入到目标表中。

INSERT INTO DestinationTable (ID, Name, Age, Email)
SELECT ID, Name, Age, Email
FROM SourceTable;

上述代码使用 INSERT INTO 语句将 SourceTable 中的数据插入到 DestinationTable 中。通过 SELECT 子句,我们可以指定要复制的列。

2.2 使用 SELECT INTO 语句

另一种方法是使用 SELECT INTO 语句,直接创建一个新的目标表,并将源表中的数据复制到新表中。

SELECT ID, Name, Age, Email
INTO DestinationTable
FROM SourceTable;

上述代码将 SourceTable 中的数据复制到一个新的 DestinationTable 中。

3. 处理大数据

如果需要处理大量数据,以上方法可能会导致性能问题或超出表空间限制。为了解决这个问题,我们可以使用以下方法。

3.1 使用分页查询

分页查询是一种将数据分成多个较小块进行处理的技术。我们可以使用 OFFSET 和 FETCH NEXT 语句来实现分页查询。

DECLARE @PageSize INT = 1000; -- 每页大小
DECLARE @PageNumber INT = 1; -- 起始页码

DECLARE @TotalRows INT; -- 总行数
DECLARE @TotalPages INT; -- 总页数

-- 获取总行数
SELECT @TotalRows = COUNT(*)
FROM SourceTable;

-- 计算总页数
SET @TotalPages = CEILING(CAST(@TotalRows AS DECIMAL) / @PageSize);

-- 逐页复制数据
WHILE @PageNumber <= @TotalPages
BEGIN
    INSERT INTO DestinationTable (ID, Name, Age, Email)
    SELECT ID, Name, Age, Email
    FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, ID, Name, Age, Email
        FROM SourceTable
    ) AS SubQuery
    WHERE RowNum BETWEEN (@PageNumber - 1) * @PageSize + 1 AND @PageNumber * @PageSize;

    SET @PageNumber = @PageNumber + 1;
END

上述代码使用分页查询将 SourceTable 中的数据逐页复制到 DestinationTable 中。@PageSize 变量指定每页的大小,@PageNumber 变量指定起始页码。通过计算总行数和总页数,我们可以循环复制数据,并使用 ROW_NUMBER() 函数进行分页。

3.2 使用 BULK INSERT

对于非常大的数据集,我们可以使用 BULK INSERT 语句进行快速数据复制。BULK INSERT 语句可以高效地将数据从一个文件加载到表中。

首先,我们需要将源表中的数据导出为一个文件。

DECLARE @FilePath VARCHAR(100) = 'C:\data\SourceData.csv';

SELECT ID, Name, Age, Email
INTO OUTFILE @FilePath
FROM SourceTable;

上述代码将 SourceTable 中的数据导出为一个名为 SourceData.csv 的文件。

然后,我们可以使用 BULK INSERT 语句将文件中的数据加载到目标表中。

DECLARE @FilePath VARCHAR(100) = 'C:\data\SourceData.csv';

BULK INSERT DestinationTable
FROM @FilePath
WITH (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    FIRSTROW = 2 -- 如果文件包含标题行,则从第二行开始导入数据
);
``