我是SQL的新手,在学习了MySQL之后,现在让SQL Server可以使用。
我正在创建一个新表,在该表中,我希望每次将值插入其他列时都会自动更新ploy_id列。
我写了以下内容,并将其添加到SSMS中的“默认值或绑定”中:
CONCAT(334600,IF no_id>=10 SELECT no_id
ELSE CONCAT(0,no_id),substring(last_name, 1, 1),substring(first_name, 1, 1))
想法是id_no列将自动具有基于IDENTITY(1,1)
的值,我可以使用该数字以及first_name和last_name的首字母来自动生成唯一的雇主编号。
结果应为:
id_no | first_name | last_name | employer_id
1 | John | Hamilton | 33460001HJ
但是这不起作用! 它一直在说:
消息8152,级别16,状态13,服务器[pc_name] \ SQLEXPRESS,第1行 字符串或二进制数据将被截断。该声明已经 终止。
我在这里做什么错了?
答案 0 :(得分:0)
我认为您不需要默认值。仅当您在该列中插入空值时才使用这些值,而不是在更新后使用。如果您希望每次在另一列中进行更改时都更新一列,则需要一个计算列。另请参见https://docs.microsoft.com/en-us/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-2017
alter table myTable
add myComputedColumn AS CONCAT(
334600,
right('0' + cast(no_id as varchar), 2), -- this is a better way to add leading zeros
substring(last_name, 1, 1),
substring(first_name, 1, 1)
);
如果希望将数据物理存储在表中,则可以使用持久化的计算列。