300*_*300 1 sql sql-server-2016
我在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)
Run Code Online (Sandbox Code Playgroud)
现在', B'
,如果列注释的值为:,我想附加到列注释的值:
如果列注释的值为NULL,我想在列注释中添加/插入/添加'B'。
我尝试过的
UPDATE table_2
SET notes=notes+', '+'B'
WHERE col_percent = 5.8
Run Code Online (Sandbox Code Playgroud)
但这会引发错误:
消息8152,级别16,状态13,行14
字符串或二进制数据将被截断。
当我尝试
UPDATE table_2
SET notes=notes+', '+'B'
WHERE col_percent = 9.9
Run Code Online (Sandbox Code Playgroud)
它显示(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
Run Code Online (Sandbox Code Playgroud)
您必须更改的类型notes
。当前,您已定义notes
为:
[notes] [nvarchar] NULL
Run Code Online (Sandbox Code Playgroud)
您尚未包括长度,因此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;
Run Code Online (Sandbox Code Playgroud)
或者,更好的是:
UPDATE table_2
SET notes = notes + ', ' +'B'
WHERE col_percent = 9.9 AND notes IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)