首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 開發 10 大常見問題深度解答:命名規範、CLR 效能、並發、新索引、空表檢測

     編輯:關於SqlServer

針對開發者最常遇到的 10 個 SQL Server 疑難雜症,提供權威解答與最佳實踐代碼,涵蓋命名規範、CLR vs T-SQL 效能、並發控制、管理工具變更、索引新特性、空表檢測腳本。

1. 表/欄位命名規範 (SQL Server 2000)

  • 長度 1-128 字元,首字元:Unicode 字母 / `_` / `@` / `#`。`@` 開頭=變數/參數,`#` 開頭=臨時表,`##` 開頭=全域臨時表。
  • 後續字元:Unicode 字母、十進制數字、`@`、`$`、`#`、`_`。
  • 不可為保留字;含特殊字元/空格需加方括號 `[My Table]` 訪問。

2. 無 T-SQL 能寫 CLR 預存程序嗎?

技術上可行 (用 ADO.NET 類在 CLR 內存取資料),但無 T-SQL 無法訪問資料。CLR 適合:複雜運算、正則表達式、檔案/網路操作、加密;資料存取仍建議 T-SQL。混合模式:CLR 呼叫 T-SQL 或反之。

3. CLR vs T-SQL 效能比較

  • 標準 CRUD:T-SQL 勝出 (原生優化)。
  • 複雜數學、字串處理、加密、正則:CLR 勝出 (編譯代碼、基類庫豐富)。
  • 鐵律:用你的資料、在你的伺服器、跑兩套基準測試。

4. 在 SP 中使用另一個 SP 的結果集

CREATE PROC usp_Demo_AllAuthors AS SELECT * FROM pubs..authors; GO

CREATE PROC usp_Demo_SPUser AS
BEGIN
  CREATE TABLE #Authors (au_id VARCHAR(11) PRIMARY KEY, ...);
  INSERT INTO #Authors EXEC usp_Demo_AllAuthors;  -- 核心:INSERT EXEC
  SELECT au_fname + ' ' + au_lname AS name FROM #Authors;
  DROP TABLE #Authors;
END; GO

限制:來源 SP 僅能回傳單一結果集;多結果集需改用 OPENROWSET 或重構。

5. SQL Server 2005 並發問題解決 (售票系統)

問題:SELECT free_seats ... IF >0 INSERT 非原子,雙併發超賣。

方案 A:唯一鍵約束。每座位一列,UNIQUE (SeatID),INSERT 失敗即表示已售出,無需額外鎖。

方案 B:Service Broker。每車建立會話,座位訊息入佇列,RECEIVE 原子取出,天然防重複。

6. SQL Server 2005 取代查詢分析器的工具

SQL Server Management Studio (SSMS):整合 Enterprise Manager + Query Analyzer,UI 升級、IntelliSense、物件總管、內建報表、政策管理。

7. SQL vs T-SQL 差異

  • SQL = ANSI/ISO 標準;T-SQL = 微軟實現 (基於 SQL-92/99 + 私有擴展)。
  • T-SQL 擴展:`TOP`、`IDENTITY`、`TRY_CATCH`、CLR、Service Broker、XML/XQuery 等。
  • 驗證標準合規:SET FIPS_FLAGGER ON 會標記非標準語法。

8. SQL Server 2005 新索引類型?

關聯表無新索引類型 (仍為 B-tree 叢集/非叢集)。增強點:
• 全文檢索重寫 (支援語義、鄰近搜尋)
• XML 索引 (主 XML 索引 + 路徑/屬性/值次要索引)
• 線上索引操作 (ONLINE=ON):重建/重組不鎖表,維護窗口歸零。

9. 建立腳本:同 item_key+pack_key 取 last_sale 最大那列

SELECT t.prod_key, t.item_key, t.pack_key, t.last_sale
FROM YourTable t
JOIN (
  SELECT item_key, pack_key, MAX(last_sale) AS max_sale
  FROM YourTable GROUP BY item_key, pack_key
) m ON t.item_key = m.item_key AND t.pack_key = m.pack_key AND t.last_sale = m.max_sale;

10. 列出無資料列的表 (動態 SQL 改集合寫法)

DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'SELECT ''' + name + ''' AS TableName, COUNT(*) AS Cnt FROM ' + QUOTENAME(name) + '; '
FROM sys.objects WHERE type = 'U';
EXEC sp_executesql @sql;
-- 或直接查系統表 (極快)
SELECT o.name, i.rowcnt
FROM sysobjects o JOIN sysindexes i ON o.id = i.id
WHERE o.type = 'U' AND i.indid IN (0,1) AND i.rowcnt = 0;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved