SQL Server的Linked Server支持使用SEQUENCE嗎?sql
SQL Server 2012開始支持序列(SEQUENCE),今天遇到有個同事諮詢,可否在LINKED SERVER裏面調用SEQENCE, 結果我測試發現不行,可是無論官方文檔也好,網上相關資料也罷,都沒有說支持,也沒有說不支持。數據庫
例如官方文檔NEXT VALUE FOR (Transact-SQL)中明確表示那些狀況不支持使用序列的NEXT VALUE FOR函數。(以下所示,沒有說起LINKED SERVER)服務器
不能在下列狀況下使用 NEXT VALUE FOR 函數:app
· 數據庫處於只讀模式時。函數
· 做爲表值函數的參數。測試
· 做爲聚合函數的參數。spa
· 在子查詢中,包括公用表表達式和派生表。code
· 在視圖、用戶定義的函數或計算列中。orm
· 在使用 DISTINCT,UNION ,UNION ALL,EXCEPT或INTERSECT 運算符的語句中。server
· 在使用 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 的條件表達式中。
· 在不屬於 INSERT 語句的 VALUES 子句中。
· 在檢查約束的定義中。
· 在規則或默認對象的定義中。 (它可用於默認約束。)
· 做爲用戶定義表類型中的默認值。
· 在使用 TOP、OFFSET 的語句中,或在設置 ROWCOUNT 選項時。
· 在語句的 WHERE 子句中。
· 在 MERGE 語句中。 (在目標表的默認約束中使用 NEXT VALUE FOR 函數而且在 MERGE 語句的 CREATE 語句中使用默認值的狀況下例外。)
以下所示,這種寫法是不支持的(SSMS中執行會直接報錯),查了大量的資料,發現沒有什麼資料涉及這方面(固然,這種需求自己也是不合理的)。因此,通過驗證、測試,能夠明確的是: SQL Server中Linked Server不支持使用SEQUENCE。
SELECT NEXT VALUE FOR [LINK_SERVER_NAME].YourSQLDba.dbo.TEST_SEQ;
簡單測試,發現可使用OPENQUERY來解決這個問題。以下所示:
SELECT FROM OPENQUERY([LINK_SERVER_NAME], 'SELECT NEXT VALUE FOR YourSQLDba.dbo.TEST_SEQ');
另外,也能夠將序列放到存儲過程當中,經過鏈接服務器調用存儲過程,間接調用SEQUENCE。
CREATE PROCEDURE PRC_TEST
AS
BEGIN
SELECT NEXT VALUE FOR dbo.TEST_SEQ;
END
EXEC [LINK_SERVER_NAME].YourSQLDba.[dbo].PRC_TEST
參考資料:
https://docs.microsoft.com/en-us/sql/t-sql/functions/next-value-for-transact-sql?view=sql-server-2017