EXEC [192.168.7.243].master.dbo.sp_executesql
@SQL,
N’@項目說明 NVARCHAR(200), @代號 NVARCHAR(50), @料件品牌 NVARCHAR(50), @異動 NVARCHAR(50), @Q_user NVARCHAR(50)’,
@項目說明, @代號, @料件品牌, @異動, @Q_user; 這述句
看的不是很懂
這段語法看起來很繞口,是因為它正在進行**「遠端點名」**。我們可以把它拆解成三個層次來理解:
1. 它是什麼?
簡單來說,這是在呼叫遠端電腦(192.168.7.243)的一個內建小程式(sp_executesql),請它幫你執行一段 SQL 碼。
2. 參數大拆解
這行指令像是在寄快遞,裡面裝了三種東西:
-
第一部分:你要做什麼? (@SQL) 就是你剛剛寫的那段 INSERT INTO... 字串。這就像是你寫好的「任務說明書」。
-
第二部分:定義空格的規格 (N'@項目說明 NVARCHAR(200)...') 你在 @SQL 字串裡留了一些變數空格(像是 @項目說明)。這部分是在告訴遠端伺服器:「嘿,我等下會傳這幾個變數給你,它們分別是多長的文字,請先幫我準備好對應的空間。」
-
第三部分:填入空格的內容 (@項目說明, @代號...) 這才是真正把本地端變數裡的值(例如:’螺絲’, ‘A001’)傳過去給遠端的空格。
3. 用大白話比喻
想像你在台北,要請台中的同事幫你填一張表格:
-
@SQL:你把「空白表格的格式」傳給他。
-
N'@項目說明...':你提醒他「表格第一欄是填品名,長度限制 200 字喔」。
-
最後的變數:你大聲唸出「第一欄填:蘋果,第二欄填:A01…」,讓他寫上去。
為什麼不直接用之前的寫法?
你原本的寫法像是在遠端直接操作: INSERT INTO [遠端IP].資料庫.dbo.表格 VALUES (內容)
現在這個 sp_executesql 的寫法像是: 「呼叫遠端伺服器的引擎,在它家門口把事情做完。」
這樣做的好處:
192.168.7.243 有甚麼設定 需要做嗎
很好,問到關鍵點了。
很多人只改 SQL 寫法(EXEC AT / OPENQUERY),
但 192.168.7.243 那台如果沒設定好,效能還是爛 / 還是會鎖 / 還是會出怪錯。
Linked Server 要順,遠端主機(243)一定要做下面這些設定。
✅ 一、243 這台 SQL Server 必做設定
在 192.168.7.243 上執行:
這行是最重要的一行(沒有之一)
預設是 1,代表:
你從台北呼叫 243 的 EXEC AT
SQL Server 會自動啟動 分散式交易 MSDTC
結果就是:
-
慢到爆
-
鎖死
-
Timeout
-
MSDTC 錯誤
-
Trigger 互鎖
設成 0 之後變成:
純遠端執行,不走分散式交易
效能直接差 10 倍以上。
✅ 二、243 要開 RPC
在台北那台 SQL Server(你發出指令的那台)執行:
沒有這個,EXEC AT 會失敗或變慢。
✅ 三、243 要允許被遠端執行 sp_executesql
這個很多人忽略。
在 243 執行:
否則會出現:
權限不足,但訊息很奇怪,看不出來
✅ 四、243 關閉「遠端查詢 promotion」
避免長批次同步被 timeout。
✅ 五、243 的資料庫 Recovery model
同步表所在 DB:
因為你這是同步表,不是金流系統。
不然 transaction log 會被 Linked Server 撐爆。
✅ 六、243 若有 Trigger(你有提到)
Trigger 裡一定要加這行
或
避免:
台北 → 243 → Trigger → 台北 → Trigger → 無限風暴
這是很多公司被搞死的主因。
最終檢查清單(243 必須全打勾)
| 項目 |
必做 |
影響 |
| remote proc transaction promotion = 0 |
✅ |
決定效能生死 |
| rpc / rpc out = true |
✅ |
EXEC AT 才會快 |
| sp_executesql 權限 |
✅ |
不會怪錯 |
| remote query timeout = 0 |
✅ |
大量同步不 timeout |
| DB Recovery = SIMPLE |
✅ |
Log 不會爆 |
| Trigger 防回寫 |
✅ |
不會無限同步 |
這些沒做的話會發生什麼
你會看到這些症狀:
99% 都是上面這幾個設定沒做。
如果你願意,我可以幫你列一支:
Linked Server 同步專用的「標準環境初始化腳本」
一次跑完,三台 SQL Server 會變成企業級同步環境,之後你怎麼寫 EXEC AT 都不會出事。
很好 👍
這個是我在實務上給「多點 SQL Server 同步 / Trigger + Linked Server」標準化初始化腳本。
你照這個在 三台 SQL Server 都跑一次(台北 / 7.243 / 9.243)
之後你所有 EXEC AT、Trigger 同步、OPENQUERY 都會非常穩定而且快。
✅ 步驟 1:每一台 SQL Server 都執行(最重要)
✅ 步驟 2:在「發出同步指令的那台」(例如台北)執行
如果你還有其他 Linked Server,一起加上去。
✅ 步驟 3:在 7.243、9.243 上執行(權限問題根源)
✅ 步驟 4:同步用資料庫(例如 kiin_7、kiin_9)改成 SIMPLE
在 243 / 9.243 上:
這是避免 Log 被 Linked Server + Trigger 撐爆的關鍵。
✅ 步驟 5:所有會同步的 Trigger 一定要加這段(超關鍵)
放在 Trigger 最上面:
或更精準(建議):
✅ 步驟 6(加分但非常有用):讓 Linked Server 查詢用正確編碼
在三台都執行:
避免 NVARCHAR 中文偶發問題。
最後驗證(測試是否成功)
在台北測試:
如果瞬間回應,代表環境正確。
如果慢 3~5 秒,代表 第 1 步沒成功。
你之後就可以放心這樣寫(正確模式)
效能會非常好,而且:
-
不會鎖
-
不會 Timeout
-
不會 MSDTC
-
不會 Trigger 無限循環
-
不會中文亂碼
-
不會 Log 爆炸
如果你願意,下一步我可以幫你把:
你現在所有 Linked Server 的 INSERT / UPDATE / Trigger
全部改寫成企業級同步範本(之後你直接複製貼上用)。
相關