我在 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一直沒有更新。
有什么建議可以讓我完成這項作業嗎?
uj5u.com熱心網友回復:
最好的解決方案 - 我認為 - 將使用
- 一
ID INT IDENTITY(1,1)列讓 SQL Server 處理數值的自動遞增 - 一個計算的、持久的列,用于將該數值轉換為您需要的值
所以試試這個:
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 而不為IDor指定值時SCODE:
INSERT INTO dbo.Contact(sLastName, sFirstName, ......)
VALUES ('Doe', 'John', ......)
然后 SQL Server 將自動增加您的ID值,SCODE并將包含諸如C000512、C000513、......等值- 自動、安全、可靠、無重復。
uj5u.com熱心網友回復:
放入一個事務中,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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311517.html
標籤:sql sql-server 查询语句 sql 插入 唯一键
