在 SQL Server 線上叢書 (Books Online) 中查閱 sp_dbcmptlevel 相關文件,可以發現一張描述 SQL Server 6.0、6.5 與 7.0 之間版本相容性的資料表。其中關於 INSERT 陳述式的語法規則有著顯著差異:
INSERT X
SELECT select_list INTO Y
早期的 SQL Server 6.0 或 6.5 版本能夠正確解析這類語句,但到了 SQL Server 7.0 或 8.0 (2000) 版本則無法通過語法檢查。雖然語法中的 Y 在任何相容性層級設定下都不是實際插入操作的接收目標,但舊版資料庫仍允許這種寫法存在。新版資料庫較嚴格的語法檢查機制,反而讓開發者撰寫的程式碼更具健壯性。
以下腳本可在 SQL Server 7.0 或 2000 上執行,示範該語法如何通過舊版資料庫測試,卻在新版資料庫檢查中失敗:
SET NOCOUNT OFF
GO
USE pubs
GO
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'U' AND name = 'test')
BEGIN
DROP TABLE test
END
GO
CREATE TABLE test (col1 INT NULL, col2 INT NULL)
GO
EXEC sp_dbcmptlevel pubs, 65
GO
INSERT test
SELECT 1, 1 INTO y
GO
EXEC sp_dbcmptlevel pubs, 70
GO
INSERT test
SELECT 2, 1 INTO y
GO
執行結果將顯示:在相容性層級 65 時語句成功執行;切換至層級 70 後,相同語法將拋出錯誤。這提醒我們在進行版本升級或跨版本開發時,務必注意語法相容性差異,避免因舊語法殘留導致生產環境故障。