錯誤: 昨天給同事做一個Demo ,就是關於enhance T-Sql 中PIVOT 的用法 :select * from PrivtDemo pivot ( sum([mark]) for [course] in([語文],[數學],[英語])) as pvt 用法發生了如下的錯誤
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '('.
當時也考慮是不是相容問題,但是當時我用的倆個判斷依據, 就開始考慮是不是我的文法使用有錯誤(成功執行過,讓我很鬱悶,有道是丟什麼不能丟人啊!)
1. 資料庫連結的是Sql Server 2005 的執行個體(BQCDEV01"DEV)
2. 我看見 pivot 能被開發環境識別為關鍵字
原因分析: 但是一直找不到原因
那究竟是什麼原因(google 了下)
說是相容層級的問題
然後我在出現錯誤的資料庫裡面執行了下 EXEC sp_dbcmptlevel CallCenterEIS,90
在執行就OK了
然後為了確定是不是這個原因我又執行了下EXEC sp_dbcmptlevel CallCenterEIS,80
又開始出現開始出現的錯誤,這說明錯誤的原因已經確定就是相容性問題
但是為什麼出現這個問題
那就是我是用 Sql Server 2000 的指令碼產生的工具 產生的指令碼然後在sql server 2005 利用這個指令碼產生 2005 的資料庫CallCenterEIS,但是Sql Server 2000的指令碼裡面有一些只有在Sql Server 2000裡面經常使用的文法,導致 Sql Server 2005 把這個資料庫預設的相容層級設定為80
結論: 如果大家在Sql server 2005 的資料庫開發中使用 T-Sql增強新文法 的時候如果有時候出錯找不到原因的時候可以考慮是不是相容層級的問題
由 sql server 2000 升級到 sql server 2005 的資料庫在開發中如果使用了 sql server 2005 的新文法(xml 操作,排序函數等)會報出一些莫名的錯誤比如(System.Data.SqlClient.SqlException: 將截斷字串或位元據 Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('. ….)等錯誤,無法排查,其實這些錯誤都是相容性的問題
PS:
sp_dbcmptlevel (Transact-SQL)
[本主題為預先發布的文檔內容,在未來的版本中可能會更改。包括預留位置形式的空白主題。]
將某些資料庫行為設定為與指定的 SQL Server 版本相容。
重要提示: |
後續版本的 Microsoft SQL Server 將刪除該功能。請不要在新的開發工作中使用該功能,並儘快修改當前還在使用該功能的應用程式。而應使用 ALTER DATABASE。 |
Transact-SQL 文法約定
文法
sp_dbcmptlevel [ [ @dbname = ] name ]
[ , [ @new_cmptlevel = ] version ]
參數
[ @dbname = ] name
要為其更改相容層級的資料庫的名稱。資料庫名稱必須符合標識符的規則。name 的資料類型為 sysname,預設值為 NULL。
[ @new_cmptlevel = ] version
資料庫要與之相容的 SQL Server 的版本。version 的資料類型為 tinyint,預設值為 NULL。該值必須為下列值之一:
80 = SQL Server 2000
90 = SQL Server 2005
100 = SQL Server 2008
傳回碼值
0(成功)或 1(失敗)