SQL Server的Linked Server支持使用SEQUENCE嗎? SQL Server 2012開始支持序列(SEQUENCE),今天遇到有個同事咨詢,能否在LINKED SERVER裡面調用SEQENCE, 結果我測試發現不行,但是不管官方文檔也好,網上相關資料也罷,都沒有說支持,也沒... ...
SQL Server的Linked Server支持使用SEQUENCE嗎?
SQL Server 2012開始支持序列(SEQUENCE),今天遇到有個同事咨詢,能否在LINKED SERVER裡面調用SEQENCE, 結果我測試發現不行,但是不管官方文檔也好,網上相關資料也罷,都沒有說支持,也沒有說不支持。
例如官方文檔NEXT VALUE FOR (Transact-SQL)中明確表示那些情況不支持使用序列的NEXT VALUE FOR函數。(如下所示,沒有提及LINKED SERVER)
不能在下列情況下使用 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 的條件表達式中。
· 在不屬於 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