我的SQL Server数据库中包含以下列
的表ID | NAME | DOB | APPLICATION NO |
1 | JOHN | 31/05/1986 | KPL\2014\1 |
2 | MARY | 26/04/1965 | KPL\2014\2 |
3 | VARUN | 15/03/1972 | KPL\2014\3 |
此处列ID
是自动增量列,列APPLICATION NO
依赖于ID
。
这意味着APPLICATION NO
是KPL\
,YEAR
和ID
列值的串联。
然后我该如何进行插入查询?
答案 0 :(得分:1)
为什么不使用计算列?
我会更改表格的定义。
添加“年”栏
添加“application_name”列(如果它不总是“KPL”)。
然后使用所需的字段
创建计算列alter table <yourTable> add computed_application_name as (application_name + '/' + CAST(<yearColumn> as VARCHAR(4) + '/' + <otherColumn> + CAST(id as VARCHAR(MAX))
答案 1 :(得分:1)
只需使用计算列:
alter table t
add application_no as ('KPL' + cast(year(getdate()) as varchar(255)) + cast(id as varchar(255));
我觉得你真的想要插入行的那一年。为此,我建议添加createdat
列,然后使用该列代替getdate()
:
alter table t add CreatedAt datetime default getdate();
如果表中有数据,则设置值(如果表为空,则不需要此值):
update table t set CreatedAt = getdate();
然后定义application_no
:
alter table t
add application_no as ('KPL' + cast(year(CreatedAt) as varchar(255)) + cast(id as varchar(255));
答案 2 :(得分:0)
使用SCOPE_IDENTITY获取插入的记录ID
Declare @Id INT
Insert Into TABLENAME(NAME ,DOB )
Values('Name','1/1/1990')
Set @Id=SCOPE_IDENTITY()
IF(@Id>0)
begin
declare @col varchar(100)=''
set @col= 'KPL\' + CONVERT(varchar(4),YEAR(GETDATE()))+'\' + CONVERT(varchar(4),@Id)
Update TABLENAME
SET APPLICATIONNO= @col
Where ID = @id
end
答案 3 :(得分:0)
只需使用'APPLICATION_NO'的计算列:
create table tbl (
ID int,
NAME varchar(10),
DOB date,
APPLICATION_NO as ('KPL\'+cast(year(dob) as char(4))+'\'+cast(id as varchar))
)
您还可以进一步持久化并将其编入索引。
答案 4 :(得分:0)
您可以创建一个在插入后运行的触发器。在您的插入中,忽略application_no。您的触发器会根据ID更新此列。
这样的事情:
CREATE TRIGGER [TRIGGER_TABLE1] ON TABLE1
AFTER INSERT
AS
BEGIN
UPDATE TABLE1
SET APPLICATION_NO = 'KPL\' + CONVERT(VARCHAR, YEAR(GETDATE())) + '\' + CONVERT(VARCHAR, ID)
WHERE APPLICATION_NO IS NULL
END
编辑:这样,您也应该能够使用其他列值。 APPLICATION_NO只需要接受NULL值。因此,您可以像这样控制将要更新的内容。
答案 5 :(得分:0)
如果你真的想自己用insert语句来做:
和TABLE1
是您在问题中描述的表格,TABLE2
将是您要从中导入数据的表格:
DECLARE @MAXID INT
SELECT @MAXID = MAX(ID) FROM TABLE1
INSERT INTO TABLE1
(NAME,DOB,APPLICATION_NO)
SELECT
NAME,
DOB,
'KPL\'
+ CONVERT(CHAR(4),YEAR(GETDATE()) +'\'
+ CONVERT(VARCHAR(25), @MAXID + ROW_NUMBER() OVER (ORDER BY NAME)) AS APPLICATION_NO
FROM TABLE2