• 週二. 2 月 17th, 2026

天南訊息

IT 工作者的工作紀錄

SQL 述句 EXEC [192.168.7.243].master.dbo.sp_executesql

個人頭像照片

By伍芳左

2 月 4, 2026

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. 用大白話比喻

想像你在台北,要請台中的同事幫你填一張表格:

  1. @SQL:你把「空白表格的格式」傳給他。

  2. N'@項目說明...':你提醒他「表格第一欄是填品名,長度限制 200 字喔」。

  3. 最後的變數:你大聲唸出「第一欄填:蘋果,第二欄填:A01…」,讓他寫上去。


為什麼不直接用之前的寫法?

你原本的寫法像是在遠端直接操作: INSERT INTO [遠端IP].資料庫.dbo.表格 VALUES (內容)

現在這個 sp_executesql 的寫法像是: 「呼叫遠端伺服器的引擎,在它家門口把事情做完。」

這樣做的好處:

  • 效率高:遠端伺服器不需要重新分析你的 SQL 語句。

  • 出錯率低:參數化的傳遞方式,可以避免因為特殊符號(例如字串裡有單引號 ')導致語法崩潰。

 

192.168.7.243 有甚麼設定 需要做嗎

很好,問到關鍵點了。

很多人只改 SQL 寫法(EXEC AT / OPENQUERY),
192.168.7.243 那台如果沒設定好,效能還是爛 / 還是會鎖 / 還是會出怪錯

Linked Server 要順,遠端主機(243)一定要做下面這些設定


✅ 一、243 這台 SQL Server 必做設定

192.168.7.243 上執行:

EXEC sp_configure 'remote proc transaction promotion', 0;
RECONFIGURE;

這行是最重要的一行(沒有之一)

預設是 1,代表:

你從台北呼叫 243 的 EXEC AT
SQL Server 會自動啟動 分散式交易 MSDTC

結果就是:

  • 慢到爆

  • 鎖死

  • Timeout

  • MSDTC 錯誤

  • Trigger 互鎖

設成 0 之後變成:

純遠端執行,不走分散式交易

效能直接差 10 倍以上


✅ 二、243 要開 RPC

台北那台 SQL Server(你發出指令的那台)執行:

EXEC sp_serveroption '192.168.7.243', 'rpc out', 'true';
EXEC sp_serveroption '192.168.7.243', 'rpc', 'true';

沒有這個,EXEC AT 會失敗或變慢。


✅ 三、243 要允許被遠端執行 sp_executesql

這個很多人忽略。

在 243 執行:

GRANT EXECUTE ON sys.sp_executesql TO public;

否則會出現:

權限不足,但訊息很奇怪,看不出來


✅ 四、243 關閉「遠端查詢 promotion」

EXEC sp_configure 'remote query timeout', 0;
RECONFIGURE;

避免長批次同步被 timeout。


✅ 五、243 的資料庫 Recovery model

同步表所在 DB:

ALTER DATABASE kiin_7 SET RECOVERY SIMPLE;

因為你這是同步表,不是金流系統。

不然 transaction log 會被 Linked Server 撐爆。


✅ 六、243 若有 Trigger(你有提到)

Trigger 裡一定要加這行

IF APP_NAME() LIKE '%SQL Server%' RETURN;

IF HOST_NAME() = '台北那台主機名稱' RETURN;

避免:

台北 → 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 防回寫 不會無限同步

這些沒做的話會發生什麼

你會看到這些症狀:

  • Linked Server 很慢(其實是 MSDTC)

  • 偶發 Timeout

  • 偶發死鎖

  • 中文欄位偶發亂碼

  • 同步時 CPU 飆高

  • Log 爆增

  • 明明語法沒錯卻會卡住

99% 都是上面這幾個設定沒做。


如果你願意,我可以幫你列一支:

Linked Server 同步專用的「標準環境初始化腳本」

一次跑完,三台 SQL Server 會變成企業級同步環境,之後你怎麼寫 EXEC AT 都不會出事。

 

個人頭像照片

By 伍芳左

MIS, ERP Pro... RHCE Member (7.2)

發表迴響