SQL Server:导入和归档每周数据

Posted

技术标签:

【中文标题】SQL Server:导入和归档每周数据【英文标题】:SQL Server: Importing and archiving weekly data 【发布时间】:2016-10-17 14:51:05 【问题描述】:

任何想法/建议表示赞赏....

有人要求我想出一种简单的方法来导入我们从外部供应商处收到的新数据(文本文件)。我们得到几个文本文件,每个文件都需要导入到自己的表中。有些表必须将当前/现有数据移动到名为TABLENAME_Previous 的表中(以处理各种现有报告),然后清空当前表并将新数据导入其中。此外,现在“上一个”表中的任何数据都必须附加到存档表中。

这是一个例子:

customer.txt 来自供应商....

    首先我们将customers_previous的内容移动到customers_arch

    接下来我们将customers的内容移动到customers_previous

    最后我们将新的customers.txt文件导入到表customers

有没有人编写过一个 SQL 例程来执行此操作,或者知道在哪里可以找到一个,修改起来不会太痛苦?

谢谢

【问题讨论】:

customer.txt 文件是定界的还是固定的?文本文件的示例数据也会有所帮助。 逗号分隔的 CSV 我们实际上有 12 个不同的文本文件,每个文件有 10 到 50 个字段,所以在这里发布它们的内容会很痛苦 每周的文本文件名是否一致?并且所有表都是 textfilename_previous 到 textfilename_arch 等?如果名称一致,那么 SSIS 应该能够处理这个问题。 是的,它们是一致的(幸运的是!) 我从来没有使用过 SSIS,你能给我指一个资源来找到一种方法吗? 【参考方案1】:

你可以试试这样的:

将您以前的数据复制到存档

Insert into customers_arch select * from customers_previous

将您的客户数据复制到上一个:

truncate table customers_previous;
insert into customers_previous select * from customers

然后要加载您的文本文件,请在清除后使用 Bulk Insert 加载您的客户表。

truncate table customers;
bulk    insert customers
from    'd:\yourfolder\customers.txt'
WITH   
      (  
         FIELDTERMINATOR =',',  
         ROWTERMINATOR ='\n'  
      );

更新: 好的,Brian,回答你的另一个问题,如何为保存在 WeeklyTable 中的多个文件运行它。

假设你的 WeeklyTable 是这样的:

Declare @WeeklyTable TABLE(ID int Identity(1,1), [FileName] varchar(50))
insert into @WeeklyTable Values
('Customers'),('Orders'), ('Order_Details')

您可以创建一个动态查询来为每个文件运行脚本。

Declare @Template varchar(max)
Set @Template = '
    -- Start of [[FILENAME]] --------------------
    Insert into [FILENAME]_arch select * from [FILENAME]_previous
    GO

    truncate table [FILENAME]_previous;
    insert into [FILENAME]_previous select * from [FILENAME]
    GO

    truncate table [FILENAME];
    bulk    insert [FILENAME]
    from    ''d:\yourfolder\[FILENAME].txt''
    WITH   
          (  
             FIELDTERMINATOR ='','',  
             ROWTERMINATOR =''\n''  
          );


'
Declare @s varchar(max)
Declare @FileName varchar(50)
Declare @ID int =0

Select TOP 1 @ID=ID, @FileName=[FileName] From @WeeklyTable Where ID>@ID order by ID
While @@ROWCOUNT>0 Begin
    Set @s = REPLACE(@Template, '[FILENAME]', @FileName)
    Print @s
--  EXEC(@s)  -- Uncomment to EXEC the script.
    Select TOP 1 @ID=ID, @FileName=[FileName] From @WeeklyTable Where ID>@ID order by ID
End

【讨论】:

谢谢,我试试看...看起来很简单! 另一个问题......我怎么能写这个来为几个表中的每一个做这个,我在一个名为的表中 如何为名为 SELECT [FileName] ,[FileAfterRename] ,[TableName] 的表中命名的每个表运行它 该死,我总是不小心添加新的未完成的 cmets...啊!无论如何......我如何为名为 WeeklyFiles 的表中的每个表运行此操作,其中包含一个名为 FieldName 的字段 @BrianBattles,请查看更新后的代码,用于保存在 WeeklyFiles 中的多个文件。

以上是关于SQL Server:导入和归档每周数据的主要内容,如果未能解决你的问题,请参考以下文章

sql server如何导入数据库

如何远程把sql server中的数据导入到本地sql server中?

使用导入和导出向导将平面文件导入 SQL Server

怎样把本地sql server数据库导入到服务器

[转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

如何将EXCEL数据导入到SQL SERVER数据库中