基于大小拆分和导出数据库表

时间:2012-10-31 12:03:29

标签: c# sql sql-server-2008 csv sqlcmd

全部,我已经开发了一种导出机制,允许将来自givem数据库的选定表导出到.csv文件;我可以使用bcpsqlcmd执行此操作。对于大型表(> 1-2GB),我想将表拆分为几个用户指定大小(例如200MB)的.csv文件。

如何确定构成用户指定大小的行数?这样我就可以使用sqlcmd命令,如下所示

DECLARE @sql VARCHAR(8000);
SELECT @sql = 'sqlcmd -S' + @@SERVERNAME + ' -E -Q ' + 
              '"SELECT * FROM Ia.dbo.[Episode];" -o "F:\aaData\Test2.csv" -s"," -W';
EXEC master..xp_cmdshell @sql;

使用TOP N子句获取正确的拆分.csv大小。我可能需要使用批量读取来计算行数,还是有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

如果您希望导出的文件尽可能接近用户指定的大小,则需要采用更具编程性的方法。考虑:

public void Export( int fileSize )
{
    SqlDataReader reader = // command to return the recordset to export...

    int bytesLeft = fileSize;

    // open first output file
    while ( reader.Read() )
    {
        // write the row
        bytesLeft -= // length of the row you just wrote

        if ( bytesLeft <= 0 )
        {
            // close this file
            // open the next file
            bytesLeft = fileSize;
        }
    }

    // close the last file.
}

此答案旨在强调拆分您正在导出的文件的机制。阅读数据和编写我遗漏的文本文件的详细信息,但您可以通过阅读SqlDataReaderwriting text files获取有关这些文件的更多信息。