【问题标题】:SQL update numeric column from decimal datatypeSQL 从十进制数据类型更新数字列
【发布时间】:2011-08-20 05:41:37
【问题描述】:

我正在尝试从 decimal(10,2) 更新 numeric(5,2) 类型的列,但该列仍然为空,并且我没有错误消息。

DECLARE @newDurationAsDec decimal(10,2) 
DECLARE @newDurationAsNum numeric(5,2)

--@newDurationAsDec is set by some logic from another table and holds the correct value e.g 2.00

set @newDurationAsNum = CAST(@newDurationAsDec AS numeric(5,2)) 
--selecting @newDurationAsNum contains the correct value e.g. 2.00

UPDATE table
SET Duration = @newDurationAsNum
WHERE ID = @ID AND
      Duration IS NULL AND
      OtherColumn = 'T'

不会重传任何错误,也不会更新列。将更新更改为选择会返回正确的行。有人可以指出我的错误吗? 提前致谢。

【问题讨论】:

  • @id 的值是多少?您确定有匹配的记录吗?
  • Duration IS NULL AND OtherColumn = 'T' => 也许这些条件不满足?
  • 您确定WHERE 子句中的过滤器与现有行匹配吗?尝试使用相同的参数运行 select 语句。
  • 使用相同参数运行 select 语句会返回正确的行
  • @5n0u7 - 你有什么触发器吗?

标签: sql sql-server casting


【解决方案1】:

在下面对我来说很好。检查没有可能干扰事物的触发器。

如果您至少使用 SQL Server 2005,则可以使用 OUTPUT 子句查看更新的行,如下所示。

CREATE TABLE #T
(
ID INT PRIMARY KEY,
Duration NUMERIC(5,2),
OtherColumn CHAR(1)
)

INSERT INTO #T VALUES (1,NULL,'T')

DECLARE @ID INT = 1
DECLARE @newDurationAsDec DECIMAL(10,2) = 2

DECLARE @newDurationAsNum NUMERIC(5,2)
SET @newDurationAsNum = CAST(@newDurationAsDec AS NUMERIC(5,2)) 
SELECT @newDurationAsNum

UPDATE #T
SET Duration = @newDurationAsNum
OUTPUT inserted.*, deleted.*
WHERE ID = @ID AND
  Duration IS NULL AND
  OtherColumn = 'T'

SELECT * FROM #T  

DROP TABLE #T

【讨论】:

    【解决方案2】:

    运行选择以查看您将要更新的内容。我嵌入了我的更新语句,如下所示,因此只需注释和取消注释代码行,就可以轻松地从选择到更新来回移动

    --UPDATE t
    --SET Duration = @newDurationAsNum 
    Select *,   @newDurationAsNum
    FROM table t
    WHERE ID = @ID AND
           Duration IS NULL AND
           OtherColumn = 'T' 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2014-03-09
      • 2023-03-29
      • 1970-01-01
      • 2018-06-24
      相关资源
      最近更新 更多