SQL 服务器:每晚从文件中批量插入数据
SQL Server: Bulk Insert data from file nightly
我正在尝试构建一个计划程序,以便每晚抓取 ftp 到服务器的文件,然后对内容进行批量插入。
我面临的问题是文件名每天都在变化 date/timestamp。我需要构建这个 SQL 命令:
BULK INSERT TableName
FROM '\server\directory_name1\directory_name2\date_time_filename.csv'
"filename.csv" 永远不会改变,文件进入的目录永远不会改变,这是应该按计划发生的。
它并不总是能成功地做到这一点。因此,即使我能以某种方式 CONCAT
将 date, time, and filename
放入 FROM
语句中,该文件也可能不存在,因为它未能在通常时间到达那里。
我也不认为我可以 CONCAT
进入 @variable
并在 FROM 中使用它,如 FROM @variable
。有人知道这是否可能吗?
.
接下来我想我会看看访问目录并浏览它以查找文件,但这似乎有点笨拙
我会这样做:
DECLARE @sqlCmd NVARCHAR(400);
SET @sqlCmd = CONCAT(
'BULK INSERT dbo.TableName FROM ''', '\server\directory_name1\directory_name2\'
, FORMAT(GETDATE(), 'yyyyMMdd_HHmmss'), '_filename.csv''');
-- PRINT @sqlCmd;
-- EXEC sys.sp_executesql @sqlCmd;
非常感谢。那解决了这个问题。我通过添加各种配置设置的 CONCAT 来添加它。此外,服务器脚本在 23:00 PM 运行,而我直到第二天才使用该文件,因此日期延迟了一天。所以我不得不做一些 DATEADD 工作。我做了 2 个 CONCATS 以使其更易于使用。太多的引号无法双引号等。它变得令人困惑。我完成的代码是这样的:
DECLARE @sqlCmd NVARCHAR(400);
DECLARE @now DATETIME2 = GETDATE();
SET @sqlCmd = CONCAT(
'BULK INSERT dbo.MyTable FROM ''', '\server\directory1\directory2\'
, FORMAT((SELECT DATEADD(DAY, -1, @now)), 'yyyy-MM-dd'), '_2300_filename.csv''');
SET @sqlCmd = CONCAT(@sqlCmd,
' WITH ( FIRSTROW = 2,
CODEPAGE=65001,
DATAFILETYPE = ''char'',
BATCHSIZE = 50,
FIELDTERMINATOR = '';'',
ROWTERMINATOR = ''0x0A''
);'
);
我正在尝试构建一个计划程序,以便每晚抓取 ftp 到服务器的文件,然后对内容进行批量插入。
我面临的问题是文件名每天都在变化 date/timestamp。我需要构建这个 SQL 命令:
BULK INSERT TableName
FROM '\server\directory_name1\directory_name2\date_time_filename.csv'
"filename.csv" 永远不会改变,文件进入的目录永远不会改变,这是应该按计划发生的。
它并不总是能成功地做到这一点。因此,即使我能以某种方式 CONCAT
将 date, time, and filename
放入 FROM
语句中,该文件也可能不存在,因为它未能在通常时间到达那里。
我也不认为我可以 CONCAT
进入 @variable
并在 FROM 中使用它,如 FROM @variable
。有人知道这是否可能吗?
.
接下来我想我会看看访问目录并浏览它以查找文件,但这似乎有点笨拙
我会这样做:
DECLARE @sqlCmd NVARCHAR(400);
SET @sqlCmd = CONCAT(
'BULK INSERT dbo.TableName FROM ''', '\server\directory_name1\directory_name2\'
, FORMAT(GETDATE(), 'yyyyMMdd_HHmmss'), '_filename.csv''');
-- PRINT @sqlCmd;
-- EXEC sys.sp_executesql @sqlCmd;
非常感谢。那解决了这个问题。我通过添加各种配置设置的 CONCAT 来添加它。此外,服务器脚本在 23:00 PM 运行,而我直到第二天才使用该文件,因此日期延迟了一天。所以我不得不做一些 DATEADD 工作。我做了 2 个 CONCATS 以使其更易于使用。太多的引号无法双引号等。它变得令人困惑。我完成的代码是这样的:
DECLARE @sqlCmd NVARCHAR(400);
DECLARE @now DATETIME2 = GETDATE();
SET @sqlCmd = CONCAT(
'BULK INSERT dbo.MyTable FROM ''', '\server\directory1\directory2\'
, FORMAT((SELECT DATEADD(DAY, -1, @now)), 'yyyy-MM-dd'), '_2300_filename.csv''');
SET @sqlCmd = CONCAT(@sqlCmd,
' WITH ( FIRSTROW = 2,
CODEPAGE=65001,
DATAFILETYPE = ''char'',
BATCHSIZE = 50,
FIELDTERMINATOR = '';'',
ROWTERMINATOR = ''0x0A''
);'
);