[實務運用] 實作 Linked Server 遠端使用 SEQUENCE

該如何從遠端使用 SEQUENCE ??

順序物件 SEQUENCE 在 O 牌已經有一段時間了,然而 SQL Server 2012 開始也支援 SEQUENCE 了

那麼我遇到的問題又是什麼呢??


這個需求是 ServerA 上面 Linked ServerB 然後 ServerB 有 SEQUENCE

然後要從 ServerA 去使用 ServerB 的 SEQUENCE 去寫資料進 ServerB 的 Table

接下來,如果~BOSS 的如果來了... 如果可以,最好不要去動用 ServerB

嗯哼,於是我直覺式的在 ServerA 下了這段語法驗證

INSERT ServerB.DBName.dbo.TableName
VALUES(NEXT VALUE FOR dbo.Seq, N'PS4', 5)
GO

然後馬上就被 Error Message 擊落!

訊息 208,層級 16,狀態 1,行 7
Invalid object name 'dbo.Seq'.


WTF!?

於是立馬浮現了方案 B 再戰一輪!

首先在 ServerB 建立 SP 提供遠端調用

CREATE PROCEDURE InsertSeq @Name VARCHAR(20), @Qty INT
AS
BEGIN
	SET NOCOUNT ON;

	INSERT dbo.TableName VALUES(NEXT VALUE FOR dbo.Seq, @Name, @Qty)
END
GO

然後在 ServerA 調用

EXEC ServerB.DBName.dbo.InsertSeq 'PS4', 5;

哇哈哈哈~看似美好的解決了眼前的問題

萬惡的 but,這樣不就必須在 ServerB 建立預存了!?

這真的是沒辦法中的辦法了嗎!?

於是開始四處求救... 也獲得很多 SQL PASS 高手們提供的其它方案

然後很感謝 Phil 大大提供一個超棒的解決方案~

就是在 ServerA 上使用 OPENQUERY

CREATE FUNCTION GetSeq()
RETURNS INT
AS
	BEGIN
		DECLARE @x INT
		SELECT @x=Seq FROM OPENQUERY([ServerB],'SELECT NEXT VALUE FOR DBName.dbo.Seq ')
		RETURN @x
	END
GO

INSERT INTO ServerB.DBName.dbo.TableName VALUES (GetSeq(), 'PS4', 5)
GO

太棒了!完全不用動到 ServerB 就可以使用 SEQUENCE 了!

have fun ʕ•͡ᴥ•ʔ

 

參考網址:
http://sqlworker.blogspot.tw/
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql
https://www.red-gate.com/simple-talk/sql/learn-sql-server/sql-server-sequence-basics/
https://dotblogs.com.tw/dc690216/2012/09/26/75082