【问题标题】:To read CSV file data one by one from SQL Stored proc从 SQL 存储过程中一一读取 CSV 文件数据
【发布时间】:2013-01-16 17:36:45
【问题描述】:

需要一一读取CSV文件信息。即如果文件中的客户存在于客户表中,则插入详细表中,否则插入错误表中。所以我不能使用批量插入方法。

如何从 CSV 文件中逐一读取记录?如何给路径? 批量插入方法在这里不起作用。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    一种选择是使用INSTEAD OF INSERT 触发器选择性地将行放入正确的表中,然后使用普通的BULK INSERTFIRE_TRIGGERS 选项。

    接近的东西;

    CREATE TRIGGER bop ON MyTable INSTEAD OF INSERT AS
    BEGIN
        INSERT INTO MyTable
        SELECT inserted.id,inserted.name,inserted.otherfield FROM inserted
        WHERE inserted.id IN (SELECT id FROM customerTable);
    
        INSERT INTO ErrorTable
        SELECT inserted.id,inserted.name,inserted.otherfield FROM inserted
        WHERE inserted.id NOT IN (SELECT id FROM customerTable);
    END;
    
    BULK INSERT MyTable FROM 'c:\temp\test.sql' 
        WITH (FIELDTERMINATOR=',', FIRE_TRIGGERS);
    
    DROP TRIGGER bop;
    

    如果您定期导入文件,您可以创建一个具有相同架构的表 (ImportTable),在其上设置触发器并通过批量导入到 ImportTable 来导入到 MyTable。这样您就可以保留触发器,并且只要您导入到ImportTable,您就不需要为每次导入进行任何特殊的设置/过程。

    【讨论】:

      【解决方案2】:

      使用批量插入加载到临时表中,然后逐行处理。

      【讨论】:

      • 暂存表是个好主意,但为什么要逐行处理呢?根据具体情况,最好同时对整个数据集使用MERGE 或仅使用INSERTUPDATE
      【解决方案3】:
      CREATE TABLE #ImportData
      (
          CVECount varchar(MAX), 
          ContentVulnCVE varchar(MAX),
          ContentVulnCheckName varchar(MAX)
      )
      
      BULK INSERT #ImportData
      FROM 'D:\test.csv'
      WITH
      (
          FIRSTROW = 2,
          FIELDTERMINATOR = ',',  --CSV field delimiter
          ROWTERMINATOR = '\n',   --Use to shift the control to next row
          TABLOCK
      )
      select * from #ImportData
      //Here you can write your script to user read data one by one
      DROP TABLE #ImportData
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多