所以,這裏是我會怎麼處理它:
我表:
CREATE TABLE [dbo].[deal]
(
[dealName] varchar(100),
[resourceCount] int
)
然後創建了dealName列的唯一索引:
CREATE UNIQUE NONCLUSTERED INDEX [UQ_DealName] ON [dbo].[deal]
(
[dealName] ASC
)
一旦你的唯一索引,然後你可以只用try/catch語句
SET NOCOUNT ON;
DECLARE @dealName VARCHAR(100) = 'deal'
DECLARE @resourceCount INT = 8
DECLARE @count INT
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO dbo.deal (dealName,resourceCount)
VALUES (@dealName, @resourceCount)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@ERROR = 2601
BEGIN
ROLLBACK TRANSACTION
SET @count = (SELECT COUNT(dealName) FROM dbo.deal WHERE resourceCount = @resourceCount)
SET @resourceCount = (SELECT resourceCount FROM dbo.deal WHERE dealName = @dealName)
SET @dealName = @dealName + ' Cloned ' + CAST(@count AS VARCHAR(100))
BEGIN TRANSACTION
INSERT INTO dbo.deal (dealName,resourceCount)
VALUES (@dealName,@resourceCount)
COMMIT TRANSACTION
END
END CATCH
SELECT * FROM dbo.deal
您可以輕鬆地把這個處理任何例外,如違反唯一約束(錯誤2601)直接在T-SQL代碼插入到一個過程中,它所做的就是嘗試插入一個具有資源計數的交易名稱,如果唯一約束被違反,它將進入catch塊,在查找資源計數後追加所需的信息到交易名稱原始交易,然後插入這些值。我發現這種技術非常有用,不僅僅是爲了強制唯一性,還可以使用類似的方式處理異常數字來處理死鎖,主鍵違規和其他錯誤,全部在T-SQL中。
等等,什麼?爲什麼?爲什麼不直接連接ProjectName的日期和時間呢? –
這是不是我們的工作,要求業務爲什麼......這只是做和死:) ..雖然這是業務請求,所以它必須完成 –
是的,你必須提供有用的功能的業務。不,你不必完全按照你想要的方式來做這件事。如果此表上有一個標識列,並且行不會被刪除(或者只是軟刪除),那麼在選擇過程中沒有理由不能在視圖或類似中生成正確的編號。您不一定必須*存儲*這個字符串。即使您確實想要存儲號碼,分開存儲號碼並使* display *項目名稱爲計算列也更爲明智。 –