sp_configure 'clr enabled', 1; RECONFIGURE;test,結構 user,資料表 test1,登入 test_user (sysadmin,供偵錯用)。StoredProcedures.cs:using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[SqlProcedure]
public static void SelectAll()
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM [user].test1", conn);
SqlContext.Pipe.ExecuteAndSend(cmd);
}
}
}
csc /t:library /out:testProcedure.dll testProcedure.cstest → 「組件」→ 右鍵「新增組件」→ 選取 testProcedure.dll → 確定。CREATE PROCEDURE [user].SelectAll
AS EXTERNAL NAME testProcedure.[StoredProcedures].SelectAll;
GO
EXEC [user].SelectAll; 即可看到結果。錯誤:無法執行 sp_enable_sql_debug
原因:
1. 連線不穩定 / 防火牆阻擋。
2. 權限不足:VS 執行帳戶與 SQL 連線帳戶皆需為 sysadmin 角色。
| 情境 | 建議 |
|---|---|
| 複雜運算、正則運算式、加密、檔案 I/O、外部 API 呼叫 | CLR (C#/VB.NET) |
| 集合操作、JOIN、彙總、資料完整性邏輯 | T-SQL (集合導向、最佳化器友善) |
| 需要交易控制、觸發器 | T-SQL |
| 效能敏感、大量資料集運算 | T-SQL (避免 Context 切換) |
SAFE:預設,僅存取資料庫內部資源。EXTERNAL_ACCESS:存取檔案、網路、登錄等外部資源。UNSAFE:非受控程式碼,需 TRUSTWORTHY 或簽署非對稱金鑰。CLR 預存程序擴展了資料庫程式設計能力,但慎用於核心業務邏輯,優先考慮 T-SQL 集合操作優勢。