进行多次插入时更新每个插入的唯一值(字符串)
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))
这个插件应该可以制作几百个插件。
但是这里我想插入 scode
像 C000512
, 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
中插入一行而没有 指定 ID
或 SCODE
的值时:
INSERT INTO dbo.Contact(sLastName, sFirstName, ......)
VALUES ('Doe', 'John', ......)
然后 SQL 服务器将 自动 增加您的 ID
值,并且 SCODE
将包含 C000512
、C000513
,......等等 - 自动、安全、可靠、无重复。
将其放入事务中,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;
我在 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))
这个插件应该可以制作几百个插件。
但是这里我想插入 scode
像 C000512
, 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
中插入一行而没有 指定 ID
或 SCODE
的值时:
INSERT INTO dbo.Contact(sLastName, sFirstName, ......)
VALUES ('Doe', 'John', ......)
然后 SQL 服务器将 自动 增加您的 ID
值,并且 SCODE
将包含 C000512
、C000513
,......等等 - 自动、安全、可靠、无重复。
将其放入事务中,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;