【问题标题】:Inserting concatenate Identity column with other column插入与其他列连接的标识列
【发布时间】:2015-02-23 12:08:58
【问题描述】:
I have a identity column and i have other column while inserting a new row in 
 table i need to insert into third column with concatenate of two columns result 

参考见下表

------------------------------------------------
 A    |   B   |  c  
----------------------------------------------
 1    |  33   |   133(1 [identity result] + 33)    
 2    |  112  |   2112

请帮我解决这个问题。

【问题讨论】:

  • Google 用于 MSSQL 中的计算列。 ALTER TABLE myTable ADD c AS CONVERT(INT,CONVERT(VARCHAR(10),A)+CONVERT(VARCHAR(10),B));
  • 这里 A 是 Identity(1,1) 插入新行时我需要获取 A 值

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

这个问题已经有了答案,但我认为这不是实现它的最佳方法。

这是一个关于如何使用computed column 实现它的示例。

CREATE TABLE dbo.calculatedTEST (
    A INT IDENTITY(1,1) NOT NULL,
    B INT NOT NULL,
    c AS CONVERT(INT,CONVERT(VARCHAR(max),A)+CONVERT(VARCHAR(max),B))
)

insert into dbo.calculatedTEST 
(B)
values
(1),
(1),
(2),
(2)

select * from dbo.calculatedTEST 

计算列是根据可以使用其他表达式的表达式计算得出的 同一个表中的列。表达式可以是非计算列 名称、常量、函数以及它们的任意组合 一名或多名运营商。表达式不能是子查询。

除非另有说明,否则计算列是虚拟列 没有物理存储在表中。重新计算它们的值 每次在查询中引用它们时。数据库引擎使用 CREATE TABLE 和 ALTER TABLE 语句中的 PERSISTED 关键字 将计算列物理存储在表中。他们的价值观是 当作为其计算一部分的任何列发生更改时更新。经过 将计算列标记为 PERSISTED,您可以在 确定性但不精确的计算列。此外, 如果计算列引用 CLR 函数,则数据库引擎 无法验证函数是否真正具有确定性。在这个 在这种情况下,计算列必须是 PERSISTED 以便索引可以 在其上创建。有关更多信息,请参阅在 Computed 上创建索引 列。

【讨论】:

  • +1 是的。你能解释一下吗? c AS CONVERT(INT,CONVERT(VARCHAR(max),A)+CONVERT(VARCHAR(max),B))
  • @user3540365 添加了关于微软参考的文章中的一些信息并链接了文章。
  • 将数值转换为字符串值使 SQL 引擎能够在没有任何错误和求和数学过程的情况下连接它们
  • 但在我的情况下,表已经定义,我需要插入到该表中。
【解决方案2】:

无需插入C列,使用Select语句即可轻松获取C列。

像这样。

select A,B,cast(Cast(A as varchar(max))+cast(B as varchar(max)) as 
varchar(max)) as C from Your_Table_Name

如果你真的需要插入C列,那么你必须同时运行insert和Update查询来在表的C列中插入值。

喜欢:

 insert into Table_Name(B) values('33');Select IDENT_CURRENT();
 --you'll get the inserted Identity.
--now run the Update query for Identity you get from the insert query.

示例。

 create table #tab1
 (
 Id bigint identity(1,1) primary key,
 a int,
 b varchar(50)
 )

insert into #tab1(a) values(88);
declare @id1 as bigint set @id1=(select SCOPE_IDENTITY());
update #tab1 set b=cast(id as varchar(max))+cast(a as varchar(max)) where Id=@id1

【讨论】:

  • 插入tbl_test(B,C)值(122,"这里我需要获取A的Identity值"+122)
  • 我应该在 C 中插入值,在我的情况下它已经预定义的表。
  • 那么您必须在使用 SCOPE_IDENTITY() 获取插入的标识值后运行更新查询。
  • 我知道这种方式,但我需要检查它是否可以在单个语句中完成..
猜你喜欢
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多