【问题标题】:Update Column based on Bulk insert from CSV SQL基于 CSV SQL 的批量插入更新列
【发布时间】:2015-05-29 04:13:06
【问题描述】:

我正在尝试根据 CSV 文件更新表格。我有 CSV 中的 ID 和修剪编号列表,我需要根据 SQL 表中的特定 ID 更新修剪编号。

到目前为止我写的脚本

-- Create a temporary table for the import
   drop table #InterpreterTrimNumbers
   CREATE TABLE #InterpreterTrimNumbers( 
  [SAPInterpreterId] int,
  TempTrimNumber varchar(100)
)

BEGIN TRANSACTION
  -- Bulk import into the temporary table
  BULK INSERT #InterpreterTrimNumbers FROM 'C:\CSVData\Trim numbers.csv' WITH (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    ERRORFILE = 'C:\CSVData\Trim numbers-errors.csv',
    TABLOCK
  )

  update Interpreters set TrimNumber = (select TempTrimNumber from #InterpreterTrimNumbers where #InterpreterTrimNumbers.SAPInterpreterId = Interpreters.SAPInterpreterID )
  Commit Transaction

即使 CSV 文件只有 110 条记录,这也会返回 1824 行受影响的行。我只想用特定的 SAPInterpreterID 更新记录

感谢任何帮助。

【问题讨论】:

  • 我有 110 条记录,是的,ID 是唯一的。
  • 我只是好奇..即使我执行的查询更新了相关记录并且似乎工作正常。但它显示更新的记录数不正确。你知道为什么会这样吗?
  • 实际上我的 CSV 文件已经从实际表中获得了子记录集。而且是一对一的。但是当我在解释器上运行我的查询时,它不在 csv 中但在 SQL 表中有修剪数字。注意到通过运行该查询将修剪编号设置为空。它可能在实时服务器上搞砸了整个事情。你救了我的命..干杯:)
  • 很高兴它有帮助。现在这是有道理的。您拥有的语法将更新每个数字。 = 后面的查询如果有匹配则选择一个 id,如果没有匹配则选择 NULL。因此,将不匹配的记录更新为 null。

标签: sql sql-server csv


【解决方案1】:

假设您只有 110 条记录插入临时表,并且 ID 在 Interpreters 表中是唯一的,那么您的语法应该是这样的

UPDATE i 
SET TrimNumber = tempintr.TempTrimNumber
FROM Interpreters AS i INNER JOIN 
     #InterpreterTrimNumbers tempintr
     ON i.TrimNumber= tempintr.TempTrimNumber

您的查询不起作用的原因是它试图更新 Interpreters 表中的每个数字。当与临时表匹配时,是的,这就是您所需要的。但是当没有匹配时,您的查询将返回NULL,导致不匹配的记录更新为NULL

【讨论】:

    【解决方案2】:
    df10 = pd.read_csv("/tmp/z34.csv")
    
    iters = df10.iterrows()
    
    
        for index, row in iters:
            conn = psycopg2.connect(host=rds_host,
                               database=db_name,
                               user=name,
                               password=password)
       
        cur.execute(
                    'UPDATE "master_brand" SET  "description" = %s, "created_at" = %s, 
                     "updated_at" = %s WHERE "master_brand"."brand_name" = %s',
                     [row['description'], row['created_at'], row['updated_at'],
                     row['brand_name']])
       
        conn.commit()
       
        conn.close()
    

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2011-04-16
      • 2017-09-06
      • 2020-11-09
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多