SQL2012 全部数据太大 怎么导出到多个文件

SQL2012 全部数据太大 怎么导出到多个文件,第1张

/*

--用BCP试试,不行再用下面的存储过程

EXEC master..xp_cmdshell 'bcp "select * from test.dbo.Apo_village"

queryout "c:/Apo_SFZ.xlsx" -c -S"服务器" -U"sa" -P"密码"'

*/

--这是用C#写的存储过程,不知道你会不会编译到SQL Server

--在数据库这样调用就是了

--Exec BulkCopyToXls 'SQL查询语句','路径','文件名',最大记录数

--Exec BulkCopyToXls 'select * from 表','G:\Test','Table',60000

using System

using System.Data

using System.Data.SqlClient

using System.Data.SqlTypes

using Microsoft.SqlServer.Server

public partial class myProcedure

{

[Microsoft.SqlServer.Server.SqlProcedure]

public static void BulkCopyToXls(SqlString sql, SqlString savePath, SqlString tableName, SqlInt32 maxRecordCount)

{

if (sql.IsNull || savePath.IsNull || tableName.IsNull)

{

SqlContext.Pipe.Send(" 输入信息不完整!")

}

//每个excel文件最大容纳65534

ushort _maxRecordCount = ushort.MaxValue - 1

if (maxRecordCount.IsNull == false &&maxRecordCount.Value <ushort.MaxValue &&maxRecordCount.Value >0)

_maxRecordCount = (ushort)maxRecordCount.Value

ExportXls(sql.Value, savePath.Value, tableName.Value, _maxRecordCount)

}

private static void ExportXls(string sql, string savePath, string tableName, System.UInt16 maxRecordCount)

{

//创建文件路径

if (System.IO.Directory.Exists(savePath) == false)

{

System.IO.Directory.CreateDirectory(savePath)

}

using (SqlConnection conn = new SqlConnection("context connection=true"))

{

conn.Open()

using (SqlCommand command = conn.CreateCommand())

{

command.CommandText = sql

using (SqlDataReader reader = command.ExecuteReader())

{

int i = 0

int totalCount = 0

int tick = System.Environment.TickCount

SqlContext.Pipe.Send(" 开始导出数据")

while (true)

{

string fileName = string.Format(@"{0}/{1}.{2}.xls", savePath, tableName, i++)

int iExp = Write(reader, maxRecordCount, fileName)

long size = new System.IO.FileInfo(fileName).Length

totalCount += iExp

SqlContext.Pipe.Send(string.Format(" 文件{0}, 共{1} 条, 大小{2} 字节", fileName, iExp, size.ToString("###,###")))

if (iExp <maxRecordCount) break

}

tick = System.Environment.TickCount - tick

SqlContext.Pipe.Send(" 导出数据完成")

SqlContext.Pipe.Send("-------")

SqlContext.Pipe.Send(string.Format(" 共{0} 条数据,耗时{1}ms", totalCount, tick))

}

}

}

}

private static void WriteObject(ExcelWriter writer, object obj, System.UInt16 x, System.UInt16 y)

{

//判断写数字还是写字符

string type = obj.GetType().Name.ToString()

switch (type)

{

case "SqlBoolean":

case "SqlByte":

case "SqlDecimal":

case "SqlDouble":

case "SqlInt16":

case "SqlInt32":

case "SqlInt64":

case "SqlMoney":

case "SqlSingle":

if (obj.ToString().ToLower() == "null")

writer.WriteString(x, y, obj.ToString())

else

writer.WriteNumber(x, y, Convert.ToDouble(obj.ToString()))

break

default:

writer.WriteString(x, y, obj.ToString())

break

}

}

private static int Write(SqlDataReader reader, System.UInt16 count, string fileName)

{

int iExp = count

ExcelWriter writer = new ExcelWriter(fileName)

writer.BeginWrite()

//写字段信息

for (System.UInt16 j = 0j <reader.FieldCountj++)

{

writer.WriteString(0, j, reader.GetName(j))

}

//循环一行一行读入数据

for (System.UInt16 i = 1i <= counti++)

{

if (reader.Read() == false)

{

iExp = i - 1

break

}

//循环一格一格写入数据

for (System.UInt16 j = 0j <reader.FieldCountj++)

{

WriteObject(writer, reader.GetSqlValue(j), i, j)

}

}

writer.EndWrite()

return iExp

}

public class ExcelWriter

{

System.IO.FileStream _wirter

//创建文件

public ExcelWriter(string strPath)

{

_wirter = new System.IO.FileStream(strPath, System.IO.FileMode.OpenOrCreate)

}

//写数组

private void _writeFile(System.UInt16[] values)

{

foreach (System.UInt16 v in values)

{

byte[] b = System.BitConverter.GetBytes(v)

_wirter.Write(b, 0, b.Length)

}

}

//写文件头

public void BeginWrite()

{

_writeFile(new System.UInt16[] { 0x809, 8, 0, 0x10, 0, 0 })

}

//文件尾

public void EndWrite()

{

_writeFile(new System.UInt16[] { 0xa, 0 })

_wirter.Close()

}

//写数字到单元格

public void WriteNumber(System.UInt16 x, System.UInt16 y, double value)

{

_writeFile(new System.UInt16[] { 0x203, 14, x, y, 0 })

byte[] b = System.BitConverter.GetBytes(value)

_wirter.Write(b, 0, b.Length)

}

//写字符到单元格

public void WriteString(System.UInt16 x, System.UInt16 y, string value)

{

byte[] b = System.Text.Encoding.Default.GetBytes(value)

_writeFile(new System.UInt16[] { 0x204, (System.UInt16)(b.Length + 8), x, y, 0, (System.UInt16)b.Length })

_wirter.Write(b, 0, b.Length)

}

}

}

收缩 Tempdb 的方法

此方法要求您重新启动 SQL Server。

1. 停止 SQL Server。打开命令提示符,然后键入以下命令启动 SQL Server:

sqlservr -c -f

-c 和 -f 参数使 SQL Server 以最小配置模式启动,让数据文件的 tempdb 大小为 1 MB,日志文件的 tempdb 为 0.5 MB。

注意:如果使用 SQL Server 命名实例,必须切换到适当的文件夹 (Program Files/Microsoft SQL Server/MSSQL$instance name/Binn),并使用 -s 开关 (-s%instance_name%)。

2. 用查询分析器连接到 SQL Server,然后运行下列 Transact-SQL 命令: ALTER DATABASE tempdb MODIFY FILE

(NAME = 'tempdev', SIZE = target_size_in_MB)

--Desired target size for the data file

ALTER DATABASE tempdb MODIFY FILE

(NAME = 'templog', SIZE = target_size_in_MB)

--Desired target size for the log file

3. 通过在命令提示符窗口中按 Ctrl-C 停止 SQL Server,将 SQL Server 作为服务重新启动,然后验证 Tempdb.mdf 和 Templog.ldf 文件的大小。

此方法的局限是它只能对默认的 tempdb 逻辑文件 tempdev 和 templog 进行 *** 作。如果将其他文件添加到了 tempdb,您可以在将 SQL Server 作为服务重新启动后收缩它们。在启动过程中将重新创建所有 tempdb 文件;因此,它们是空的并可删除。要删除 tempdb 中的其他文件,请使用带有 REMOVE FILE 选项的 ALTER DATABASE 命令。

1、将你要执行的sql语句写入一个txt文件中;

2、修改文件后缀为.sql文件;

3、使用 “source + 路径+文件名”

注:source与路径之间有空格。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12104099.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存