如何在SQL Server存储过程中获取CSV文件大小
SQL Server存储过程获取CSV文件大小的实现方案
以下三种方案可根据实例版本、安全配置直接选用:
方案1:使用
sys.dm_os_enumerate_filesystem(优先推荐,无安全风险)
适用于SQL Server 2017及更高版本,不需要开启任何额外组件,仅需要调用账号拥有VIEW SERVER STATE权限即可,是官方原生支持的最安全方案。
示例代码:DECLARE @file_dir NVARCHAR(500) = N'D:\data_import\'; -- 替换为你的CSV文件所在目录路径 DECLARE @file_name NVARCHAR(200) = N'source_data.csv'; -- 替换为你的CSV文件名 DECLARE @file_size BIGINT; SELECT @file_size = file_size FROM sys.dm_os_enumerate_filesystem(@file_dir, @file_name); -- 输出结果单位为字节,可按需换算 SELECT @file_size AS file_size_bytes;方案2:使用OLE自动化对象(兼容低版本,无需开启xp_cmdshell)
适用于SQL Server 2008及以上版本,不需要开启高风险的xp_cmdshell,仅需要开启OLE自动化配置即可。
首先执行一次配置开启(仅需执行一次,需要实例级管理员权限):sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;存储过程内获取文件大小的示例代码:
DECLARE @file_path NVARCHAR(500) = N'D:\data_import\source_data.csv'; -- 替换为CSV完整路径 DECLARE @fso INT, @file_obj INT, @file_size BIGINT; EXEC sp_OACreate 'Scripting.FileSystemObject', @fso OUT; EXEC sp_OAMethod @fso, 'GetFile', @file_obj OUT, @file_path; EXEC sp_OAGetProperty @file_obj, 'Size', @file_size OUT; -- 释放COM对象避免内存泄漏 EXEC sp_OADestroy @file_obj; EXEC sp_OADestroy @fso; SELECT @file_size AS file_size_bytes;方案3:使用
xp_cmdshell调用系统命令(开发环境快速实现)
适用于开发环境快速验证,需要开启xp_cmdshell配置,生产环境不推荐使用。
配置开启代码(仅需执行一次):sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE;获取文件大小示例代码:
DECLARE @file_path NVARCHAR(500) = N'D:\data_import\source_data.csv'; -- 替换为CSV完整路径 DECLARE @cmd NVARCHAR(1000), @file_size BIGINT; -- 注意xp_cmdshell中执行for循环变量需要双写百分号 SET @cmd = N'for %%I in ("' + @file_path + '") do @echo %%~zI'; CREATE TABLE #cmd_result (output NVARCHAR(1000)); INSERT INTO #cmd_result EXEC master..xp_cmdshell @cmd; SELECT @file_size = CAST(TRIM(output) AS BIGINT) FROM #cmd_result WHERE ISNUMERIC(TRIM(output)) = 1; DROP TABLE #cmd_result; SELECT @file_size AS file_size_bytes;
通用注意事项:
- 所有方案读取的都是SQL Server服务端可访问的文件,路径必须是服务器本地路径、或是SQL Server服务启动账号拥有读取权限的UNC共享路径,存储在本地客户端的文件无法通过上述方法读取
- 所有方案返回的文件大小单位均为字节,可根据业务需要自行换算为KB/MB/GB单位
- 所有方案均要求SQL Server服务启动账号对目标CSV文件拥有至少读取权限
内容的提问来源于stack exchange,提问作者Naveen Chandra kandpal
相关产品推荐
相关产品推荐

