NEXT VALUE FOR (Transact-SQL)
從指定的順序物件產生序號。
如需建立和使用順序的完整討論,請參閱<序號>。您可以使用 sp_sequence_get_range 來產生序號的範圍。
適用於:SQL Server (SQL Server 2012 至目前版本)、SQL Database V12。 |
語法
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ]
引數
database_name
包含順序物件的資料庫名稱。schema_name
包含順序物件的結構描述名稱。sequence_name
產生數字的順序物件名稱。over_order_by_clause
決定將順序值指派給資料分割中之資料列的順序。如需詳細資訊,請參閱<OVER 子句 (Transact-SQL)>。
傳回類型
使用順序的類型傳回數字。
備註
NEXT VALUE FOR 函數可用於預存程序和觸發程序中。
當 NEXT VALUE FOR 函數用於查詢或預設條件約束時,如果使用相同的順序物件不只一次,或在提供值的陳述式中以及正在執行的預設條件約束中使用相同的順序物件,則會對結果集中資料列內參考相同順序的所有資料行傳回相同值。
NEXT VALUE FOR 函數不具決定性,而且只允許用於產生的順序值數目是妥善定義的內容中。以下是指定的陳述式中每個參考的順序物件將會使用多少個值的定義:
SELECT - 針對每個參考的順序物件,為陳述式結果中的每個資料列,產生一次新值。
INSERT …VALUES - 針對每個參考的順序物件,為陳述式中每個插入的資料列,產生一次新值。
UPDATE - 針對每個參考的順序物件,為陳述式所更新的每個資料列,產生一次新值。
程序陳述式 (例如 DECLARE、SET 等)- 針對每個參考的順序物件,為每個陳述式產生一次新值。
限制事項
NEXT VALUE FOR 函數不適用於下列情況:
當資料庫在唯讀模式中。
做為資料表值函式的引數。
做為彙總函式的引數。
在子查詢中,包括通用資料表運算式和衍生資料表。
在檢視表、使用者定義函數或計算資料行中。
在使用 DISTINCT、UNION、UNION ALL、EXCEPT 或 INTERSECT 運算子的陳述式中。
在使用 ORDER BY 子句的陳述式中 (除非使用 NEXT VALUE FOR ...OVER (ORDER BY …)時設定。
在下列子句中:FETCH、OVER、OUTPUT、ON、PIVOT、UNPIVOT、GROUP BY、HAVING、COMPUTE、COMPUTE BY 或 FOR XML。
在使用 CASE、CHOOSE、COALESCE、IIF、ISNULL 或 NULLIF 的條件運算式中。
在不屬於 VALUES 陳述式的 INSERT 子句中。
在檢查條件約束的定義中。
在規則或預設物件的定義中 (它可以用於預設條件約束中)。
使用者定義資料表類型的預設值。
在使用 TOP、OFFSET 的陳述式中,或是設定 ROWCOUNT 選項時。
在陳述式的 WHERE 子句中。
在 MERGE 陳述式中 (除非 NEXT VALUE FOR 函數用於目標資料表的預設條件約束中,而且預設值用於 CREATE 陳述式的 MERGE 陳述式中)。
在預設條件約束中使用順序物件
在預設條件約束中使用 NEXT VALUE FOR 函數時,下列為適用規則:
可從多個資料表中的預設條件約束來參考單一順序物件。
資料表和順序物件必須位於相同的資料庫。
加入預設條件約束的使用者必須有順序物件的 REFERENCES 權限。
在卸除預設條件約束之前,無法卸除從預設條件約束參考的順序物件。
如果多個預設條件約束使用相同的順序物件,或在提供值的陳述式中以及正在執行的預設條件約束中使用相同的順序物件,則會對資料列中的所有資料行傳回相同的順序物件。
預設條件約束中 NEXT VALUE FOR 函數的參考不能指定 OVER 子句。
可以改變預設條件約束中參考的定順序物件。
當 INSERT … SELECT 或 INSERT … EXEC 陳述式中正在插入的資料來自使用 ORDER BY 子句的查詢時,則會依 NEXT VALUE FOR 子句所指定的順序來產生 ORDER BY 函數所傳回的值。
搭配 OVER ORDER BY 子句使用順序物件
NEXT VALUE FOR 函數支援透過將 OVER 子句套用到 NEXT VALUE FOR 呼叫,產生排序的順序值。透過使用 OVER 子句,可確保傳回的值依據 OVER 子句之 ORDER BY 次子句的順序來產生。搭配 NEXT VALUE FOR 子句使用 OVER 函數時,下列為額外的適用規則:
單一陳述式中為相同順序產生器的多個 NEXT VALUE FOR 函數呼叫必須全都使用相同的 OVER 子句定義。
單一陳述式中參考不同順序產生器的多個 NEXT VALUE FOR 函數呼叫可以有不同的 OVER 子句定義。
套用至 OVER 函數的 NEXT VALUE FOR 子句不支援 PARTITION BY 次子句。
如果 NEXT VALUE FOR 陳述式中所有 SELECT 函數呼叫都指定 OVER 子句,ORDER BY 子句可用於 SELECT 陳述式。
使用於 OVER 陳述式或 NEXT VALUE FOR 陳述式中時,允許 SELECT 子句與 INSERT … SELECT … 函數搭配使用。NEXT VALUE FOR在 UPDATE 或 MERGE 陳述式中不允許 函數。NEXT VALUE FOR
如果同時有另一個處理序正在存取順序物件,傳回的數字可能會有間距。
中繼資料
如需有關順序的詳細資訊,請查詢 sys.sequences 目錄檢視。
安全性
Permissions
需要順序物件或順序之結構描述的 UPDATE 權限。如需授與權限的範例,請參閱本主題稍後的範例 F。
擁有權鏈結
順序物件支援擁有權鏈結。如果順序物件與呼叫預存程序、觸發程序或資料表 (具有順序物件做為預設條件約束) 有相同的擁有者,則不需要順序物件的權限檢查。如果順序物件與呼叫預存程序、觸發程序或資料表有不同的擁有者,則需要順序物件的權限檢查。
在資料表中 NEXT VALUE FOR 函數做為預設值時,使用者需要資料表的 INSERT 權限和順序物件的 UPDATE 權限,才能使用預設值插入資料。
如果預設條件約束與順序物件有相同的擁有者,在呼叫預設條件約束時不需要順序物件的權限。
如果預設條件約束與順序物件有不同的擁有者,即使透過預設條件約束呼叫,也需要順序物件的權限。
稽核
若要稽核 NEXT VALUE FOR 函數,請監視 SCHEMA_OBJECT_ACCESS_GROUP。
範例
如需建立順序和使用 NEXT VALUE FOR 函數產生序號的範例,請參閱<序號>。
下列範例會使用 CountBy1 結構描述中的 Test 順序。執行下列陳述式以建立 Test.CountBy1 順序。範例 C 和 E 使用 AdventureWorks2012 資料庫,所以 CountBy1 順序是在該資料庫中建立的。
USE AdventureWorks2012 ;
GO
CREATE SCHEMA Test;
GO
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
A.在 SELECT 陳述式中使用順序
下列範例會建立名為 CountBy1 的順序,此順序每次使用時遞增一。
SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;
SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;
以下為結果集:
FirstUse
1
SecondUse
2
B.將變數設定為下一個順序值
下列範例示範三種將變數設定為下一個序號值的方法。
DECLARE @myvar1 bigint = NEXT VALUE FOR Test.CountBy1
DECLARE @myvar2 bigint ;
DECLARE @myvar3 bigint ;
SET @myvar2 = NEXT VALUE FOR Test.CountBy1 ;
SELECT @myvar3 = NEXT VALUE FOR Test.CountBy1 ;
SELECT @myvar1 AS myvar1, @myvar2 AS myvar2, @myvar3 AS myvar3 ;
GO
C.並用順序與次序視窗函數
USE AdventureWorks2012 ;
GO
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,
FirstName, LastName
FROM Person.Contact ;
GO
D.在預設條件約束的定義中使用 NEXT VALUE FOR 函數
支援在預設條件約束的定義中使用 NEXT VALUE FOR 函數。如需在 NEXT VALUE FOR 陳述式中使用 CREATE TABLE 的範例,請參閱<序號>中的<範例 C>。下列範例會使用 ALTER TABLE,將順序做為預設值加入至目前資料表。
CREATE TABLE Test.MyTable
(
IDColumn nvarchar(25) PRIMARY KEY,
name varchar(25) NOT NULL
) ;
GO
CREATE SEQUENCE Test.CounterSeq
AS int
START WITH 1
INCREMENT BY 1 ;
GO
ALTER TABLE Test.MyTable
ADD
DEFAULT N'AdvWorks_' +
CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20))
FOR IDColumn;
GO
INSERT Test.MyTable (name)
VALUES ('Larry') ;
GO
SELECT * FROM Test.MyTable;
GO
E.在 INSERT 陳述式中使用 NEXT VALUE FOR 函數
下列範例會建立名為 TestTable 的資料表,然後使用 NEXT VALUE FOR 函數插入資料列。
CREATE TABLE Test.TestTable
(CounterColumn int PRIMARY KEY,
Name nvarchar(25) NOT NULL) ;
GO
INSERT Test.TestTable (CounterColumn,Name)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Syed') ;
GO
SELECT * FROM Test.TestTable;
GO
E.搭配使用 NEXT VALUE FOR 函數與 SELECT …INTO
下列範例會使用 SELECT … INTO 陳述式建立名為 Production.NewLocation 的資料表,然後使用 NEXT VALUE FOR 函數指定每個資料列的編號。
USE AdventureWorks2012 ;
GO
SELECT NEXT VALUE FOR Test.CountBy1 AS LocNumber, Name
INTO Production.NewLocation
FROM Production.Location ;
GO
SELECT * FROM Production.NewLocation ;
GO
F.授與執行 NEXT VALUE FOR 的權限
下列範例會將 UPDATE 權限授與 AdventureWorks\Larry 使用者,以使用 Test.CounterSeq 順序執行 NEXT VALUE FOR。
GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;
請參閱
CREATE SEQUENCE (Transact-SQL)
ALTER SEQUENCE (Transact-SQL)
序號