我在Microsoft SQL Server 2016 DB中有一个数据库表“ table_2”。
CREATE TABLE table_2
(
[created_date] [date] NULL,
[complete_hour] [int] NULL,
[col_percent] [float] NULL,
[notes] [nvarchar] (400)
)
INSERT INTO table_2
VALUES ('2017-05-31', 10, 5.8, 'A'),
('2019-06-14', 11, 9.9, NULL)
现在,如果列注释的值为:
,我想在列注释的值后面附加', B'
。
如果列注释的值为NULL,我想在列注释中添加/插入/添加'B'。
我尝试过的事情:
UPDATE table_2
SET notes=notes+', '+'B'
WHERE col_percent = 5.8
但是会引发错误:
8152消息,第16级,状态13,第14行
字符串或二进制数据将被截断。
当我尝试
UPDATE table_2
SET notes=notes+', '+'B'
WHERE col_percent = 9.9
它显示(1 row affected)
,但我看到相同的数据,并且列注释在第二行中仍为NULL。
我环顾四周,似乎将列注释的数据类型从nvarchar更改为varchar(50)可以解决此问题。 (我已经测试过了)但是在实际情况下,我无法更改数据类型。
问题:如何在不更改列注释的数据类型的情况下做到这一点?
更新:将注释列声明为[notes] [nvarchar] (400)
。这解决了列注释中非空值的问题。
但是对于NULL值(例如col_percent = 9.9),它显示(1 row affected)
,但数据保持不变。
当notes列为NULL时,Zeina的解决方案确实会更新,但也会添加前导逗号。
我最终使用的解决方案(可能有比这更好的解决方案):
UPDATE table_2
SET notes = CASE
WHEN notes = 'B' THEN 'B'
WHEN notes IS NULL THEN 'B'
WHEN notes = '' THEN 'B'
ELSE notes+', '+'B'
END
WHERE col_percent = 5.8
答案 0 :(得分:4)
您必须更改notes
的类型。当前,您已将notes
定义为:
[notes] [nvarchar] NULL
您尚未包括长度,因此SQL Server使用默认长度。在这种情况下,默认长度为1,因此您只能在该列中存储一个字符。
然后使用NULL
处理CASE
值:
UPDATE table_2
SET notes = (CASE WHEN notes IS NOT NULL THEN notes + ', ' +'B'
END)
WHERE col_percent = 9.9;
或者,更好的是:
UPDATE table_2
SET notes = notes + ', ' +'B'
WHERE col_percent = 9.9 AND notes IS NOT NULL;
答案 1 :(得分:1)
UPDATE table_2 SET notes=ISNULL(notes, '') + ', B' WHERE col_percent=9.9
由于与其他任何值一起使用的NULL都被视为NULL。因此我们必须首先为NULL单元格设置一个默认值,然后将B附加到该值。