【问题标题】:Automate csv file upload into SQL Server with changing file name使用更改文件名自动将 csv 文件上传到 SQL Server
【发布时间】:2021-12-27 18:23:42
【问题描述】:

我想每天自动将某些文件上传到我的 SQL Server,但每个文件都有不同的名称。

我正在研究,发现一个简单的方法是安排一个批量插入语句每天运行,但我不知道如何实现查询中的文件名更改。我不太熟悉使用 Windows 命令提示符,但我愿意将其用作解决方案。

文件名更改类似于mmddyyyyfile,其中mmddyyyy 部分更改为与当天的日期相对应。

【问题讨论】:

  • 您根据当前日期生成文件名 - replace(convert(char(10), @x, 101), '/', '') 其中@x 是当前日期时间(或您希望导入的任何其他日期时间)。这将需要动态 sql,您可以通过一些简单的搜索找到解决方案。

标签: sql-server database windows import etl


【解决方案1】:

当我们要导入常规文件提取时,我们会在系统批量加载中使用此技术,类似于您在您的情况中描述的情况。 如果您可以访问并愿意使用 xp_cmdshell(听起来像您),那么这样做可以使用动态文件名,您不必担心您的日期模式是:

SET NOCOUNT ON;

DECLARE @cmdstr VARCHAR(1024) = 'dir c:\upload /B'; --set your own folder path here
DECLARE @FileName VARCHAR(1024);

DROP TABLE IF EXISTS #CmdOutput;
CREATE TABLE #CmdOutput (CmdOutput varchar(1024));

INSERT #CmdOutput EXEC master..xp_cmdshell @cmdstr;

DECLARE FILES CURSOR FAST_FORWARD FOR
SELECT CmdOutput
FROM  #CmdOutput
WHERE CmdOutput IS NOT NULL;

OPEN FILES;
FETCH NEXT FROM FILES INTO @FileName;

WHILE @@FETCH_STATUS = 0
BEGIN
    /*
    Use dynamic SQL to do your bulk load here based on the value of @FileName
    */
    FETCH NEXT FROM FILES INTO @FileName;
END;

CLOSE FILES;
DEALLOCATE FILES;

DROP TABLE #CmdOutput;

这将盲目地获取文件夹中的任何文件并将其包含在光标迭代中。如果包含您的 .csv 文件的文件夹将包含您没有的其他内容,那么您可以轻松地将过滤添加到定义光标以限制文件的 WHERE 子句。

最后,关于在 SQL Server 实例上启用和使用xp_cmdshell 的强制性警告。我不会在这里详细介绍(可以搜索到大量信息),但足以说明这是一个安全问题,需要在了解所涉及的风险的情况下使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    相关资源
    最近更新 更多