进行多次插入时更新每个插入的唯一值(字符串)

Update unique value (String) for each insert when doing multiple insert

我在 Microsoft SQL Server Management Studio 上执行插入操作:

INSERT INTO contact (scode, slastname, sfirstname)
    (SELECT     
         ******,
         t.slastname,
         t.sfirstname
     FROM   
         table1 t
     WHERE  
         t.slastname NOT IN (SELECT slastname FROM contact)
         AND t.slastname <> '' 
         AND t.istatus IN (0, 3, 4))

这个插件应该可以制作几百个插件。

但是这里我想插入 scodeC000512, C000513, C000514 ....

C000511 是以前存在于联系人中的最新 scode 条目。

如何使每个插入的 SCODE 插入唯一?

之前我试过

(select substring((select max(scode) from contact), 0, 5) + '0' + 
     cast(cast(substring((select max(scode) from contact),4,8) as
int)+ 1 as varchar))

或:

(SELECT Substring((SELECT Max(scode) FROM contact), 1, 5)
    + CONVERT(VARCHAR, Substring((SELECT Max(scode) FROM contact), 4, 8) + 1, 101)),
    

或者也可以通过创建一个变量。但是 SCODE 没有更新。

有什么建议可以让我完成这项工作吗?

我认为最好的解决方案是使用

  • 一个ID INT IDENTITY(1,1)列获取SQL服务器来处理你的数值的自动递增
  • 一个计算的、持久的列,用于将该数值转换为您需要的值

所以试试这个:

CREATE TABLE dbo.Contact
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    SCODE AS 'C' + RIGHT('000000' + CAST(ID AS VARCHAR(6)), 6) PERSISTED,
    sLastName VARCHAR(100),
    sFirstName VARCHAR(100)
    -- your other columns here
  )
  

现在,每次您在 Contact 中插入一行而没有 指定 IDSCODE 的值时:

INSERT INTO dbo.Contact(sLastName, sFirstName, ......)
VALUES ('Doe', 'John', ......)

然后 SQL 服务器将 自动 增加您的 ID 值,并且 SCODE 将包含 C000512C000513,......等等 - 自动、安全、可靠、无重复。

将其放入事务中,row_number 新行。

begin tran;
with mx as(
   select cast(substring(max(scode), 2, 7) as 
int) n 
   from contact)
INSERT INTO contact (scode, slastname, sfirstname)
SELECT     
         'C'+ right('000000' + cast(mx.n + row_number() over(order by (select null)) as varchar(6)), 6) ,
         t.slastname,
         t.sfirstname
     FROM   
         table1 t
         cross join mx
     WHERE  
         t.slastname NOT IN (SELECT slastname FROM contact)
         AND t.slastname <> '' 
         AND t.istatus IN (0, 3, 4);
  commit tran;