發表文章

🧾SQL Server Stored Procedure 怎麼寫?SSMS 新手必學的預存程序教學(含範例與常見錯誤)

什麼是 Stored Procedure(預存程序)?用白話解釋 如果你把 SQL 想像成「你跟資料庫說要做什麼的指令」,那 Stored Procedure 就像是: 把一串常用的 SQL 步驟「打包成一個按鈕」,以後只要按一次就會自動完成。 對完全沒寫過的人來說,你可以把它想成: Excel 的巨集(Macro) :把一堆動作錄起來,以後一鍵執行 咖啡機按鈕 :你不需要每次研究怎麼磨豆、幾度水溫,你只要按「拿鐵」就會出來 Stored Procedure 的好處 可重複使用 :同樣的查詢/更新不用每次重寫 較好維護 :邏輯集中在資料庫端,改一次所有呼叫者都更新 安全性更好 :可以只授權執行 SP,不必給使用者表格權限 效能常常更好 :SQL Server 會對 SP 做最佳化(例如執行計畫快取) 在 SSMS 裡 Stored Procedure 通常怎麼寫? 你在 SSMS 裡新增一個 Stored Procedure,本質上就是寫一段 T-SQL,常見結構是: CREATE PROCEDURE :建立新的 SP ALTER PROCEDURE :修改既有 SP EXEC :執行 SP BEGIN...END :把多行邏輯包起來 GO :告訴 SSMS「這段到這裡是一個批次」 範例 1:最簡單的 Stored Procedure(無參數) 假設你常常要查詢最近 50 筆訂單: CREATE PROCEDURE dbo.usp_Order_GetRecent AS BEGIN SELECT TOP ( 50 ) OrderId, CustomerName, OrderDate, TotalAmount FROM dbo.Orders ORDER BY OrderDate DESC ; END ; GO 怎麼執行? EXEC dbo.usp_Order_GetRecent;...

🧩 為什麼 Excel 明明有欄位,程式卻一直報錯? —— 軟體工程師用白話解釋「KeyError」的真正原因

🧠 前言: 「Excel 明明就有這個欄位,為什麼程式一直說找不到?」 這是 工程師最常被問、也最容易被誤會的問題之一 。 很多人直覺會認為: 👉 「是不是程式壞掉了?」 👉 「是不是我改錯一行?」 但實際上, 問題幾乎從來不在你「改的那一行」 。 🚨 真實情境(簡化說明) 假設你有一個 Excel 檔案,看起來長這樣: LOT_ID PRODUCT QTY A001 IC-123 500 於是你在程式中寫: value = row [ "LOT_ID" ] 結果程式卻跳出錯誤: ❌ KeyError: 'LOT_ID' 你一定會很困惑: 「欄位就在那裡啊?我眼睛沒瞎吧?」 ❗ 關鍵觀念: 👀「你看到的 Excel」≠「程式讀到的 Excel」 這一點非常重要。 🧩 為什麼會發生這種錯誤?(白話版) 原因一: 📄 Excel 的「表頭位置」不是固定的 很多 Excel 檔案其實長這樣: (空白) (說明文字) LOT_ID | PRODUCT | QTY 資料列... 但程式如果 誤把「空白列」或「說明列」當成表頭 , 那麼真正的欄位名稱就會被當成「資料內容」。 👉 結果就是: 程式以為根本沒有 LOT_ID 這個欄位 原因二: 🧼 欄位名稱有「肉眼看不到的髒東西」 例如: LOT_ID␣ (後面有空白) LOT_ID (不是一般空白,是特殊空白) Lot_ID (前後都有) 人眼看不出來,但程式是 完全不同的字串 。 原因三: 📑 同一家公司,Excel 格式卻不固定 今天的檔案: LOT_ID 在第 1 列 明天的檔案: LOT_ID 在第 3 列 👉 程式如果「假設永遠一樣」,就一定會翻車。 ❌ 常見誤會(一定要澄清) ❗「我只是改了其中一行,為什麼整個程式壞掉?」 因為: 程式在你「真正用到那一行之前」, 就已經先嘗試讀取那個欄位了 所以錯誤並不是你新加的那行造成的, 而是「資料格式不穩定」這件事早就存在。 ✅ 正確的工程師做法(概念版) 工程師不會假設 Excel 是乾淨的 工程師會「先確認表頭,再處理資料」 🛠️ 示意版解法(已全面重寫,非實際程...

🐬Spotfire Automation Services 能不能正常匯出報表?一篇搞懂「為什麼同一台機器也會失敗」與必做檢查清單

前言:我明明在 Spotfire 裡按一下就能匯出,為什麼放到 Automation Services 就不行? 很多人第一次把 Spotfire 的 IronPython 腳本丟進 Automation Services 排程時,會遇到這種崩潰情境: 在電腦上用 Spotfire Analyst 手動跑: 正常匯出 PDF/CSV 放到 Automation Services 上排程跑: 沒檔案、報錯、或跑完但什麼都沒產出 更常見的誤解是: 「Automation 與 Server 在同一台機器,應該就一定能存檔吧?」 答案是: 不一定 。 因為 Automation Services 的腳本不是用「你在桌面操作 Spotfire 的那個使用者」在跑,而是用 伺服器服務帳號(Service Account) 在背景執行。 同一台機器只代表「磁碟路徑存在」, 不代表它有權限寫入 、也不代表 資料庫連線方式相同 。 Spotfire Automation Services 在做什麼?(給完全新手的比喻) 你可以把它想成: 你在桌面點 Spotfire 匯出報表:像是「你本人拿著筆電親自操作」 Automation Services 排程跑:像是「公司派了一個機器人,半夜自動打開檔案、刷新資料、匯出報表」 重點是: 機器人不是你本人,它有自己的通行證(帳號/權限) 。 所以只要「通行證」權限不足,它就會: 建不了資料夾 寫不了檔案 連不上資料庫 找不到你指定的頁面/視覺化元件 為什麼「同一台 Server」也會失敗?5 個最常見原因 1) 檔案寫入權限不足(最常見) Automation Services 以 Windows Service 身分跑。 你在桌面能寫入 C:\某資料夾 ,不代表服務帳號也能寫入。 典型症狀 ...

🧾SQL Server 用底線分割字串並更新資料庫欄位:避免 STRING_SPLIT 版本限制與 SUBSTRING 537 錯誤的完整教學

 在資料工程與系統整合的世界裡,我們常會遇到一種「看似很小、卻很常卡住」的需求: 某個欄位是一段用 _ 底線串起來的字串,我要把其中第 3 段、第 4 段抓出來,然後寫回到資料表的兩個欄位。 例如:很多系統把「批號、廠別、日期碼、流程代號」這些資訊,塞在一條檔名或識別字串裡。當資料進到資料庫後,後續報表/查詢就會希望把這些資訊拆開成正式欄位。 但實務上會遇到三個常見坑: STRING_SPLIT 在不同版本 SQL Server 的支援差異 SUBSTRING 會噴 錯誤 537:長度無效 CROSS APPLY 的欄位引用方式不對會噴 錯誤 207:無效的資料行名稱 這篇文章會用「 完全不懂 SQL 的人也能理解的方式 」帶你把整套問題解乾淨,最後還會教你如何把結果寫回資料庫(UPDATE)。 一、為什麼 STRING_SPLIT 可能直接不能用? 很多人第一反應會用: STRING_SPLIT(字串, '_') 但你很快就會遇到版本差異: 有些文章會教 STRING_SPLIT(text, '_', 1) (多一個參數) 你的 SQL Server 如果比較舊,就會出現類似錯誤:「引數太多」 重點結論 如果你不能確定 SQL Server 版本是否支援「回傳順序(ordinal)」這個功能,最保險的作法是改用: ✅ CHARINDEX + SUBSTRING (版本相容性最好) 或 ✅ 逐段 CROSS APPLY (工程實務最穩) 二、最常見的爆炸點:SUBSTRING 537(長度無效) 當你用 SUBSTRING(text, start, length) 時, 只要 length ≤ 0 ,SQL Server 就會噴: 訊...

🐬Spotfire Automation Services 教學:為什麼排程「找不到 D 槽 DXP」?以及如何正確把報表放進 Automation 執行

前言:你以為是「程式碼問題」,其實是「系統位置」問題 很多人第一次做 Spotfire 報表排程會遇到這種情況: 手動在電腦開 DXP 一切正常 但放到 Automation Services 後,報表不跑、檔案不輸出 明明 DXP 路徑就在: D:\...\xxx.dxp 卻一直開不到 對新手來說很困惑: 「我檔案明明在那裡啊,為什麼 Automation 找不到?」 工程師的答案其實很簡單: Automation Services 是在 伺服器(Server)上跑 ,它看不到你的電腦 D 槽。 核心觀念:Automation Services 跑在 Server,不跑在你電腦 用最白話的比喻 你在家裡電腦桌面有一份檔案, 但你叫公司機房裡的一台伺服器去開「你家桌面的檔案」——當然開不到。 同理: 你看到的 D:\xxx.dxp 是你「本機」的 D 槽 Automation Services 看的世界是「伺服器」 兩者不在同一台機器 所以「正確方式」只有兩種: 把 DXP 放到 Spotfire Library (最標準) 或放到 Server 看的到的 UNC 網路共享路徑 (視公司規範) 為什麼你在 Tools 找不到 Register Script?(Spotfire 11 常見) 很多人會照教學找: Tools → Register Script 或 Add-ins / Extensions 結果發現完全沒有這些選項,甚至 Options 裡也找不到 Add-ins。 這通常不是你操作錯,而是企業環境常見的「功能控...