我希望有一個SQL Server函數dbo.GetNextNumber()
,它可以爲每個調用生成序號。據我所知,使用本地T-SQL函數是不可能的,因爲SQL Server堅持認爲函數必須是確定性的。但是,如果你能向我展示一個原生T-SQL函數,那麼這真的會讓我有一天的時間。用於生成連續號碼的SQL Server函數
我想也許這可能是使用CLR函數編寫的。由於CLR函數是靜態的,因此序列號需要存儲在set操作的調用上下文中,因爲將其存儲爲靜態變量會導致使用相同序列的多個連接,從而導致不那麼連續的數字。我不太瞭解嵌入式CLR,以瞭解是否可以從CLR端訪問set operation(select,update,delete,insert)調用上下文。
在一天結束的時候,下面的查詢
select dbo.GetNextNumber() from sysobjects
必須返回結果
1
2
3
4
5
這是確定的,如果另一個函數調用來重置上下文是必要像
exec dbo.ResetSequenceNumbers()
爲了避免一些誤解,並減少浪費你的時間回答錯誤的任務離子,請注意,我沒有尋找一個表的ID生成函數,我知道一些黑客(儘管使用proc而不是函數),涉及一些具有標識列的臨時表。 ROW_NUMBER()
函數接近,但它也不會削減。
非常感謝任何反應
末爾
附:令人驚訝的是,SQL Server確實有一個內置的功能。一個函數(假設它不能在連接和where子句中使用)很容易實現,並且非常有用,但由於某種原因,它不包含在內。
而不是問一個「sql服務器函數dbo.GetNextNumber()」,告訴我們你正在嘗試解決的問題。 –
您可以使用只有一個「ID INT IDENTITY(1,1)」列的「助手」表,並在每個INSERT後使用「SELECT SCOPE_IDENTITY()」來獲取值,或者等待SQL Server「Denali 「(2011/2012),它將[SEQUENCES as native database objects](http://sqlblog.com/blogs/aaron_bertrand/archive/2010/11/11/sql-server-11-denali-using-sequence.aspx )正是爲了這個目的 –
SQL-Server函數不必是確定性的。在某些情況下,需要確定性函數(例如計算列)。 –