AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18094
Accepted
NReilingh
NReilingh
Asked: 2012-05-18 10:39:07 +0800 CST2012-05-18 10:39:07 +0800 CST 2012-05-18 10:39:07 +0800 CST

使用字符限制的 Web 表单使用唯一数据更新许多 (>3000) 记录的方法

  • 772

好的,正如您可能从标题的最后一部分中看出的那样,这是一个不理想的情况。

我正在使用一款行业特定的 Web 界面软件,我保证没有人听说过它,虽然它提供的海量数据输入功能很有限,但它确实允许我直接在其底层运行 SQL 查询MS SQL 数据库通过 8,000 个字符限制的 Web 表单。这是我对数据库的最直接访问。

我需要更新大约 3,700 条记录中的特定字段,每个记录都有唯一的数据。根据这个答案,我一直在做以下事情:

UPDATE guest
  SET info4 = CASE guestid
    WHEN 12345 THEN 'BNID: 917546553'
    WHEN 67890 THEN 'BNID: B04695465'
    [etc, etc.]
    ELSE info4
  END

(该info4字段当前对于所有记录都是空的。)在达到字符限制并且必须使用下一个数据块运行新更新之前,我可以将大约 200 个案例放入一个查询中。

到目前为止我发现的事情:

  • 不包括最后的ELSE声明将清空所有不满足案例的记录的字段。
  • 在提交之前,我得到“受影响的行数:[表中的行数]”,而不是实际获得新数据的行数。

我知道我应该在最后放置一个WHERE guestid IN (12345, 67890)以避免在每一行上运行更新,但是为了避免在每个更新语句块中运行超过我的字符限制,这将是地狱般的。

碰巧的是,我目前正在从 Excel 电子表格中获取源数据,将其全部粘贴到 Notepad++ 中,在其上运行查找/替换以插入必要的 SQL 语法,然后根据字符限制将其分块。

所以,简而言之,我的问题是:我是否已经尽可能地探索了这一点?有什么大而明显的东西我错过了,还是我应该以完全不同的方式解决这个问题?每个案例减少字符的奖励积分!

sql-server-2000 update
  • 2 2 个回答
  • 1444 Views

2 个回答

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2012-05-18T11:06:02+08:002012-05-18T11:06:02+08:00

    SET可以简单一点:

    SET info4 = 'BNID: ' +
      CASE guestid
        WHEN 12345 THEN '917546553'
        WHEN 67890 THEN 'B04695465'
          [etc, etc.]
                              --- no ELSE here
      END 
    
    WHERE info4 IS NULL       --- and this is needed
    

    每个案例节省 6 个字符。


    如果您可以创建一个表(甚至是临时表),您还可以使用:

    --- run once
    CREATE TABLE #tmp
    ( guestid INT NOT NULL
    , i4 VARCHAR(200)
    , PRIMARY KEY (guestid)
    ) ;
    
    --- as many times as needed
    INSERT INTO #tmp VALUES
    (12345,'917546553'),
    ...
    (67890,'B04695465');
    

    接着:

    UPDATE guest
      SET info4 = 'BNID: ' + i4
    FROM guest
      JOIN #tmp
        ON #tmp.guestid = guest.guestid
    WHERE guest.info4 IS NULL
    
    • 3
  2. JNK
    2012-05-18T10:48:27+08:002012-05-18T10:48:27+08:00

    尝试这样的事情:

    WHILE 1=1
    BEGIN
        UPDATE TOP (10000) guest
        SET info4 = CASE guestid
        WHEN 12345 THEN 'BNID: 917546553'
        WHEN 67890 THEN 'BNID: B04695465'
        [etc, etc.]
        ELSE info4
        END
        WHERE info4 IS NULL
        IF @@ROWCOUNT<10000 BREAK;
    END
    

    这将一次更新 10k 行。由于您需要更新的唯一行将具有NULLinfo4,因此我们对其进行过滤。

    • 2

相关问题

  • 将 DTS 作业迁移到 2008 Server

  • Sql 2000 附加错误 5172

  • 如何确定导致触发器触发的进程的名称

  • 将 SQL Server 2000 移动到 SQL Server 2005 时出错 NOLOCK 错误

  • SQL Server 2000:列出并禁用所有触发器

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve