2013-08-22 65 views
0

我有一個嵌入在我不想更改的C#代碼片段中的SQL Select查詢。我的問題是,查詢執行罰款2008 SQLServer的而不是2012年。在SQLServer 2012中按順序查詢別名列的查詢

問題的代碼行是:

Select code as SiteCode from TimeSheetContracts S order by S.SiteCode 

執行。在上SQL2008數據庫,它工作正常。相同的數據庫升級到SQLServer的2012和錯誤有以下...

Msg 207, Level 16, State 1, Line 2 
Invalid column name 'SiteCode'. 

如果我編輯查詢是

Select code as SiteCode from TimeSheetContracts S order by SiteCode 

它工作正常。任何人都可以解釋嗎?

回答

2

TimeSheetContracts中沒有列,因此調用SiteCode,因此對s.SiteCode的引用無效。從SQL Server 2000開始,ORDER BY中的混淆現象稍微嚴格一些,當時語法稍微寬容一些。如果您的數據庫位於COMPATIBILITY_LEVEL = 80(繼續在90或更大的其他數據庫上嘗試它),那麼s.SiteCode可用於您的SQL Server 2008實例。一旦你轉移到SQL Server 2012,80不再是一個選項。在2005年,2008年或2008 R2實例,試試這個:

CREATE DATABASE floob; 
GO 
USE floob; 
GO 
CREATE TABLE dbo.SalesOrderHeader(SalesOrderID INT); 
GO 
SELECT SalesOrderID AS ID FROM dbo.SalesOrderHeader AS h ORDER BY h.ID; -- fails 
GO 
ALTER DATABASE floob SET COMPATIBILITY_LEVEL = 80; 
GO 
SELECT SalesOrderID AS ID FROM dbo.SalesOrderHeader AS h ORDER BY h.ID; -- works 
GO 
USE master; 
GO 
DROP DATABASE floob; 

如果你想使用列別名,你需要(且始終應該是)只使用別名。如果你想使用表別名前綴,你需要使用s.code