根据自动增量列插入列值

时间:2014-05-07 11:03:46

标签: sql sql-server

我的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 NOKPL\YEARID列值的串联。

然后我该如何进行插入查询?

6 个答案:

答案 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