【发布时间】:2019-06-14 19:47:30
【问题描述】:
我在 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' 附加到列注释中的值,如果列注释的值是:
- NOT 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) 但数据未更改。
Zeina 的解决方案在 notes 列为 NULL 时会更新,但它也会添加前导逗号。
我最终使用的解决方案(可能有比这更好的解决方案):
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
【问题讨论】:
-
既然是
nvarchar,你也应该将你的文字字符串声明为nvarchar;这意味着在你的字符串前面加上一个 N:N'Your Literal String'
标签: sql sql-server-2016