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 / 问题 / 171858
Accepted
tfenwick11
tfenwick11
Asked: 2017-04-25 09:25:07 +0800 CST2017-04-25 09:25:07 +0800 CST 2017-04-25 09:25:07 +0800 CST

使用“case 语法”的更新语句无法更新临时表中的特定列

  • 772

查看当前 SSRS 迁移的存储过程。我注意到下面列出的临时表 (#tempShip) 的 case 语法对临时表中的“ord_status”列没有影响。为临时表收集数据的存储过程相当庞大,因此我将避免发布。但我相信,通过为更新提供的代码,它可能会提供一些理由。

问题:

  1. 您可以利用临时表上的 case 语句作为更新吗?

  2. 除了案例陈述之外,我还应该尝试另一种方法吗?(我不认为使用带有“IF”或“WHERE EXISTS with a select statement”的子查询会对此有所帮助)

笔记:

***存储过程执行没有任何错误,临时表按预期填充数据(但使用 case 语句更新没有预期结果)

***通过做一个简单的案例陈述,如下所示,翻译发生得很好

用于测试临时表中 o​​rd_status 数据的用例转换的基本查询。输出正确

select ord_status,
 CASE
     WHEN RTRIM([ord_status]) = 'N' THEN 'New'
     WHEN RTRIM([ord_status]) = 'Q' THEN 'Printed'
     WHEN RTRIM([ord_status]) = 'P' THEN 'Picked'
     ELSE ''
 END
 from #tempShip

***正在更新临时表的存储过程结束

UPDATE  [#tempShip] SET
        [#tempShip].[DUP] = 1,
        [#tempShip].[ord_status] = 
           CASE
                 WHEN RTRIM([ord_status]) = 'N' THEN 'New'
                 WHEN RTRIM([ord_status]) = 'Q' THEN 'Printed'
                 WHEN RTRIM([ord_status]) = 'P' THEN 'Picked'
                 ELSE ''
           END

        FROM #tempShip
         INNER JOIN
    (
        SELECT X.order_N_ext, COUNT(X.order_N_ext) AS dup
        FROM #tempShip AS X
        GROUP BY X.order_N_ext
    ) AS Y
         ON #tempShip.order_N_ext = Y.order_N_ext
    WHERE Y.dup > 1;
    ----- -- mbs 3/30/2017  #22844 - add parameter @ship_type 
    SELECT * FROM #tempShip 
    WHERE ship_type LIKE @ship_type 
    -------<<<


END
DROP TABLE #tempShip

**order_N_ext

SELECT O.order_no
    , O.ext
    , CONVERT(varchar(20), O.order_no) + ' - ' + CONVERT(varchar(2), O.ext) 
AS 'order_N_ext'

数据示例:

Ord_Num  BD order_N_ext Loc     Cust        Ship_date                      Ord_Status
1252868  1  1252868 - 1 RAS HQ  21115   2017-04-19 00:00:00.000 2570.63    P       
1253995  1  1253995 - 1 RAS HQ  11471   2017-04-19 00:00:00.000 1270.45    Q       
1254526  0  1254526 - 0 RAS HQ  24104   2017-04-19 00:00:00.000 2214.67    P             
sql-server-2000 ssrs
  • 2 2 个回答
  • 3255 Views

2 个回答

  • Voted
  1. Best Answer
    tfenwick11
    2017-04-25T11:47:01+08:002017-04-25T11:47:01+08:00

    这是解决方案:(更新语句必须重新排列,以便它们自己执行。)

    UPDATE  [#tempShip] SET  [ord_status] = CASE
                    WHEN RTRIM([ord_status]) = 'N' THEN 'New'
                    WHEN RTRIM([ord_status]) = 'Q' THEN 'Printed'
                    WHEN RTRIM([ord_status]) = 'P' THEN 'Picked'
                    ELSE ''
                    END
    
    UPDATE                 [#tempShip] SET           [#tempShip].[DUP] = 1
    FROM #tempShip
    INNER JOIN
    (
    SELECT X.order_N_ext, COUNT(X.order_N_ext) AS dup
    FROM #tempShip AS X
    GROUP BY X.order_N_ext
    ) AS Y
    ON #tempShip.order_N_ext = Y.order_N_ext
    WHERE Y.dup > 1;
        ----- -- mbs 3/30/2017  #22844 - add parameter @ship_type 
        SELECT * FROM #tempShip 
        WHERE ship_type LIKE @ship_type 
        -------<<<
    
    • 0
  2. RDFozz
    2017-04-26T06:41:19+08:002017-04-26T06:41:19+08:00

    要回答您编号的问题:

    1. CASE是的,您可以在更新行时使用语句。
    2. 我确实相信您需要一份 CASE 声明。

    根据问题中的原始代码,您是:

    • 更新#tempship(其中至少有两行具有相同的order_n_ext值);
    • 基于ship_type;从 #tempship 中选择记录 和
    • 下降#tempship。

    如果碰巧没有两行具有相同的order_n_ext,或者如果确实存在这样的行但没有ship_type你正在SELECT退出临时表,那么该UPDATE语句将完美运行,但你不会看到它.

    注意:从您的回答中,您最终发现您有两个不同的UPDATE语句已合并为一个:

    • 更新ord_status所有行#tempship以显示完整的单词而不是一个字母的缩写;和
    • dup将列更新为出现在多于一行1的所有行。#tempshiporder_N_ext

    合并仅导致重复行的ord_status值更新。

    您的解决方案将其UPDATE分成两个单独的语句,几乎可以肯定是最清晰的解决方案。但是,可以用一个UPDATE语句来做到这一点:

    UPDATE t
       SET [ord_status] = CASE
                            WHEN RTRIM([ord_status]) = 'N' THEN 'New'
                            WHEN RTRIM([ord_status]) = 'Q' THEN 'Printed'
                            WHEN RTRIM([ord_status]) = 'P' THEN 'Picked'
                            ELSE ''
                          END
          ,[dup] = CASE WHEN d.rowCount > 1 THEN 1 ELSE t.dup END
      FROM #tempship t
             LEFT OUTER JOIN (SELECT order_N_ext, COUNT(*) as rowCount
                                FROM #tempship
                               GROUP BY order_N_ext
                             ) d
    

    这将设置#tempship.dup为该行1中有 2 行或更多行#tempship的位置order_n_ext,并且如果只有 1 行,则将其设置为已经存在的任何内容。

    (添加答案以整合我评论中的信息)。

    • 0

相关问题

  • Sql 2000 附加错误 5172

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

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

  • 将 SSRS 数据库 ReportServer 的恢复模式更改为 SIMPLE 是否安全?

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

Sidebar

Stats

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

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

热门标签

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