【问题标题】:stored procedure for importing txt in sql server dbsql server db中导入txt的存储过程
【发布时间】:2011-02-19 00:56:22
【问题描述】:

我必须每天从文本文件(制表符分隔)在数据库中插入新记录。 我正在尝试将其变成一个带有参数的存储过程,以便文件从中读取数据。

CREATE PROCEDURE dbo.UpdateTable

    @FilePath

    BULK INSERT TMP_UPTable 
    FROM @FilePath
    WITH 
    ( 
        FIRSTROW = 2, 
        MAXERRORS = 0, 
        FIELDTERMINATOR = '\t', 
        ROWTERMINATOR = '\n' 
    )

    RETURN

然后我会从我的代码 (C#) 中调用这个存储过程,指定要插入的文件。

这显然是行不通的,那我该怎么做呢?

要明确这里的问题是我不能将参数@FilePath 传递给FROM 子句,或者至少我不知道如何。

【问题讨论】:

  • 为什么你需要它这样做。也许您至少可以使用 SSIS、BulkCopy 或 BCP...
  • 因为数据库将被多个没有 sql server 访问权限的用户更新,他们将只提供一个 txt 文件,应用程序会将其插入到数据库中。 (先进入一个临时表,做一些检查,最后追加到另一个表)
  • 好的,但我认为使用 SSIS 加载这些文件没有问题。不知何故,这些文件将被传递到某个目录。我的意思是你可以从那里加载这些文件。如果不是这种情况,请提供更多详细信息。
  • SSIS 可以安排定期运行并检查目录,甚至可以从电子邮件帐户获取文件。很多选择。
  • 数据库位于我无法控制的 sql 服务器上,我只是将我的数据库存储在那里。现在我只有一个特快版,所以没有 ssis。

标签: c# sql-server import text-files


【解决方案1】:

对不起,我误会了。 您需要动态创建 SQL 语句,然后执行它:

    CREATE procedure dbo.UpdateTable

    @FilePath varchar(max)
AS

 declare @sql varchar(max)
 declare @parameters varchar(100)
 set @parameters = 'FIRSTROW = 2, MAXERRORS = 0, FIELDTERMINATOR = ''\\t'', ROWTERMINATOR = ''\\n'' '
 SET @SQL = 'BULK INSERT TMP_UPTable FROM ' + @FilePath + @parameters

EXEC (@SQL)

RETURN

【讨论】:

  • 这正是我想要的。我想我现在有一些其他类型的问题:“批量加载失败。数据文件中第 1 行第 1 列的列太长。验证字段终止符和行终止符是否指定正确。”
  • 可能需要对“set @parameters =...”进行一些调整。
  • 我正在查看我的文本文件 - 数据由制表符分隔(十六进制 $9),但在行尾我有同样的东西。也许分隔符没有正确转义,我试过 ''\t'' 并且我得到了同样的错误
  • 问题肯定出在txt文件中,感谢您的帮助
【解决方案2】:

对不起,如果我迟到了,但我会建议一种不同的方法 - 在 C# 应用程序中打开文件并将其转换为对 SQL 更友好的东西、DataTable 甚至 XML。在 C# 中,您可以完全控制解析文件的方式。然后编写存储过程以接受您的 DataTable 或 XML。最好使用 DataTable,但不能与 Entity Framework 一起使用。

有很多关于如何通过加入这种输入来进行插入的帮助,并且 SQL Server 针对集合操作进行了优化。

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多