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" 永远不会改变,文件进入的目录永远不会改变,这是应该按计划发生的。

它并不总是能成功地做到这一点。因此,即使我能以某种方式 CONCATdate, 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'' 
);'
);