Заказать по проблеме в T-Sql - PullRequest
2 голосов
/ 19 ноября 2010

Я получаю ошибку в следующих 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.

Работает нормально, только если я установил @ sortby = 'Date1'.

Кто-нибудь может мне сказать, есть ли какая-нибудь синтаксическая ошибка?

Ответы [ 4 ]

1 голос
/ 19 ноября 2010

Когда вы пишете оператор case / when в 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

1 голос
/ 19 ноября 2010

Разделите имена столбцов запятыми в предложении order-by.

ORDER BY 
        CASE WHEN @sortby = 'A1' THEN String2 END,
        CASE WHEN @sortby = 'B1' THEN String1 END,
        CASE WHEN @sortby = 'Date1' THEN Date1 END 
0 голосов
/ 19 ноября 2010

Вы должны привести последнее значение как varchar, в противном случае тип для заказа по выражению интерпретируется как дата:

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 голосов
/ 19 ноября 2010

Попробуйте это ..

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 
...