該如何從遠端使用 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