2010-11-19 23 views
2

問題,我得到在下面的T-SQL的錯誤: -順序按在T-SQL

DECLARE @sortby VARCHAR(10) 
SET @sortby='A1' 

SELECT String1, String2, Date1 
FROM (
     SELECT 'A1', 'B1', CONVERT(datetime,'1 July 2010 00:01:00') 
     UNION ALL 
     SELECT 'A2', 'B2', CONVERT(datetime,'2 July 2010 00:02:00') 
     ) AS a(String1,String2,Date1) 
ORDER BY 
     CASE 
       WHEN @sortby = 'A1' THEN String2 
       WHEN @sortby = 'B1' THEN String1 
       WHEN @sortby = 'Date1' THEN Date1 
     END 

ERROR:Conversion failed when converting datetime from character string. 

其工作的罰款只有當我SET @ sortby = '日期1'。

有人可以告訴我,如果有任何語法錯誤?

+0

喜sukhi,檢查我的答案與你的代碼 – 2010-11-19 07:24:10

回答

1

當你寫一個案例/時聲明T- SQL,所有返回值具有相同的數據類型是非常重要的。如果你不這樣做,你會打開自己的轉換問題。即使代碼的某些分支從未執行,也會發生此問題。

這樣的東西,下面將無法正常工作

DECLARE @DATA VARCHAR(20) 

SET @DATA = '' 

SELECT CASE WHEN @DATA IS NULL THEN NULL 
      WHEN @DATA = '' THEN 'Data is empty' 
      WHEN 0=1   THEN 1 
      END 

更多與解決方案:http://pranayamr.blogspot.com/2010/11/sql-server-casewhen-return-type.html

0

在order by語句試試這個..用逗號

DECLARE @sortby VARCHAR(10) 
SET @sortby='Date1' 

SELECT String1, String2, Date1 
FROM ( 
     SELECT 'A1', 'B1', CONVERT(datetime,'1 July 2010 00:01:00') 
     UNION ALL 
     SELECT 'A2', 'B2', CONVERT(datetime,'2 July 2010 00:02:00') 
     ) AS a(String1,String2,Date1) 
ORDER BY 
     CASE 
       WHEN @sortby = 'A1' THEN String2 
       WHEN @sortby = 'B1' THEN String1 
       WHEN @sortby = 'Date1' THEN convert(datetime,cast(Date1 as varchar(20))) 
     END 
+0

問題,我已經寫它只有在工作的罰款我SET @ sortby ='Date1'。如果我SET @ sortby ='A1',它會發生錯誤。 – Sukhjeevan 2010-11-19 06:20:06

+0

針對每一列的saperate case語句是唯一和完美的解決方案。 – Harendra 2010-11-19 06:31:03

1

單獨列名。

ORDER BY 
     CASE WHEN @sortby = 'A1' THEN String2 END, 
     CASE WHEN @sortby = 'B1' THEN String1 END, 
     CASE WHEN @sortby = 'Date1' THEN Date1 END 
+0

好吧現在它工作正常,但你可以告訴我在我早些時候發佈的聲明中有單個案例聲明的問題 – Sukhjeevan 2010-11-19 06:39:03

+1

單個案例只能有一個類型。你的case語句有一個隱含類型的日期時間,因爲引用的最後一列是日期時間。您的聲明中的其他列無法轉換爲datetime,這是導致錯誤的原因。 – 2010-11-19 18:13:25

0

你必須投中最後一個值爲varchar,否則爲order by子句的類型被解釋爲一個日期:

DECLARE @sortby VARCHAR(10) 
SET @sortby='A1' 

SELECT String1, String2, Date1 
FROM (
     SELECT 'A1', 'B1', CONVERT(datetime,'1 July 2010 00:01:00') 
     UNION ALL 
     SELECT 'A2', 'B2', CONVERT(datetime,'2 July 2010 00:02:00') 
     ) AS a(String1,String2,Date1) 
ORDER BY 
     CASE 
       WHEN @sortby = 'A1' THEN String2 
       WHEN @sortby = 'B1' THEN String1 
       WHEN @sortby = 'Date1' THEN CONVERT(VARCHAR(10), Date1, 112) 
     END 
+0

WHEN @sortby ='Date1'THEN CONVERT(VARCHAR(10),Date1,1)將對日期coulmn進行字符串比較,而不是日期時間。它不會給正確的排序數據..檢查7月1日和8月1日.. – Harendra 2010-11-19 06:39:34

+0

對不起,我匆忙,並使用錯誤的日期格式。它現在已經修復,我使用ISO(12),這將正確排序。 – 2010-11-19 06:52:48