2010-04-20 52 views
1

我正在運行一些SQL,用於標識需要標記爲刪除的記錄並將值插入這些記錄。必須更改此值以使記錄無用,並且由於數據庫限制,每條記錄必須更改爲唯一值。TSQL插入一個升序值

UPDATE Users 
SET Username = 'Deleted' + (ISNULL(
     Cast(SELECT RIGHT(MAX(Username),1) 
       FROM Users WHERE Username LIKE 'Deleted%') AS INT) 
        ,0) + 1 
FROM Users a LEFT OUTER JOIN #ADUSERS b ON 
a.Username = 'AVSOMPOL\' + b.sAMAccountName 
WHERE (b.sAMAccountName is NULL 
AND a.Username LIKE 'AVSOMPOL%') OR b.userAccountControl = 514 

這是最重要的一點:

SET Username = 'Deleted' + (ISNULL(
     Cast(SELECT RIGHT(MAX(Username),1) 
       FROM Users WHERE Username LIKE 'Deleted%') AS INT) 
        ,0) + 1 

我一直試圖做的是有刪除的記錄有其名字段設置爲「Deletedxxx」。 ISNULL是必需的,因爲可能沒有匹配SELECT RIGHT(MAX(Username),1) FROM Users WHERE Username LIKE 'Deleted%'聲明的記錄,這將返回NULL

我試圖解析這個(Msg 156, Level 15, State 1, Line 2 Incorrect syntax near the keyword 'SELECT'. Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.

我敢肯定,必須有一個更好的方式去了解這一點,任何想法時出現語法錯誤?

+0

你可以添加一個位域到該表(例如IsDeleted)並用它來標記它嗎?將使更快的查詢來獲取所有未刪除的用戶。 – Paddy 2010-04-20 11:41:35

+0

否 - 我無法修改應用程序的行爲方式,因此無法禁用用戶。用戶名字段實際上包含用戶的網絡登錄ID,應用程序使用此字段登錄使用Windows憑據的用戶,刪除這是我可以考慮禁用帳戶的唯一方法。 – 2010-04-20 12:41:35

回答

1

如果您的用戶表已有整數PK列,你可以簡單地使用這個列來產生'刪除'+ PK用戶名。

Btw,將SELECT RIGHT(MAX(用戶名),1)10個用戶後不會失敗嗎?更好地使用SUBSTRING()

+0

非常好 - 這比我的解決方案好得多。是的,我忽略了10位用戶的失敗。 – 2010-04-20 12:44:33

0

我懷疑這會更好地作爲一個多st ep SQL語句,但我不確定這是否合理。

你所看到的錯誤是因爲你試圖將一個int連接到一個字符串,你還加了1.你的操作順序在set語句中都很棘手。這就是你所要求的,但是一旦你得到9個以上的刪除條目,它就會失敗。

SELECT 'DELETED' + CAST(
ISNULL(
CAST(
SELECT RIGHT(MAX(Username),1) 
FROM #Users WHERE username LIKE 'DELETED%') 
AS INT) 
, 0) + 1) 
AS VARCHAR(3)) 

編輯:抱歉的可怕的格式。無法弄清楚如何使它可讀。

1

嚴格有必要使用增量'xxx'值嗎?你不能只使用隨機值嗎?

SET Username = Username + '_deleted_' + CAST(NEWID() AS char(36))

此外,它可能是一個壞主意,完全覆蓋登錄。鑑於您禁用了該記錄,而不是完全刪除它,我假設您需要它來進行審計或排除故障。像那樣。在這種情況下,ID爲'Deleted1234'的記錄可能太匿名。

+0

好的建議,我會去用PK,但我不知道NEWID(),所以謝謝。記錄只是被留下,因爲鏈接到它們的索引太多,但是其他屬性留在記錄中,可以唯一地標識用戶。 – 2010-04-20 13:55:36