2017-02-10 2 views
1

ich diese SQL-Im Fall erhalten wird Fehler Fehler bei der Konvertierung, wenn Datum und/oder Uhrzeit aus Zeichenfolge in SQL Server 2012

DECLARE @CurrentLocation geography; 
SET @CurrentLocation = geography::Point(@Latitude,@Longitude,4326) 

SELECT 
    ID, 
    RestaurantTitle, 
    CuisineName, 
    Latitude, Longitude, 
    MinimumOrder, 
    ImagePath, 
    CASE 
     WHEN r.OpeningTimeType IN ('24*7') 
      THEN r.OpeningTimeType 
      ELSE r.Breakfast_OpenTime 
    END AS OpenTime, 
    CASE 
     WHEN r.Breakfast_OpenTime > CONVERT (time, CURRENT_TIMESTAMP) 
      AND R.Dinner_CloseTime < CONVERT (time, CURRENT_TIMESTAMP) 
      THEN 'PRE ORDER' 
      ELSE 'ORDER NOW' 
    END AS BUTTONNAME, 
    ROUND(ROUND(GeoLocation.STDistance(@CurrentLocation), 0)/1609.34, 0) AS Distance 
FROM 
    [dbo].[tbl_Restaurant1] r 
CROSS APPLY 
    (SELECT 
     CuisineName + ',' 
    FROM 
     tbl_Cuisine 
    WHERE 
     tbl_Cuisine.ID IN (SELECT CuisineID_FK 
          FROM tbl_Restaurant_Cuisine 
          WHERE r.ID = RID_FK) 
    FOR XML PATH('')) D (CuisineName) 
WHERE 
    @CurrentLocation.STDistance([GeoLocation]) <= 40000 

Wenn ich diese SQL haben Umwandlung lief, wird eine Ausnahme ausgelöst:

Fehler bei der Konvertierung, wenn Datum und/oder Uhrzeit aus Zeichenfolge Umwandlung

Hier sind die Spalten:

ID int 
RestaurantTitle varchar(50) 
Latitude decimal(10, 6) 
Longitude decimal(10, 6) 
MinimumOrder int 
ImagePath varchar(50) 
OpeningTimeType varchar(50) 
breakfast_OpenTime time 
+0

Ihre erste Fall Aussage versucht, zu sein scheint eine Zeichenfolge ('r zu verschmelzen. OpeningTimeType') mit einem Datum und/oder einer Uhrzeit ('r.Breakfast_OpenTime'), was wahrscheinlich den Fehler verursacht. Bei einer case-Anweisung müssen die zurückgegebenen Werte alle in denselben Datentyp konvertiert werden können (der Datentyp mit der höchsten Priorität) (https://msdn.microsoft.com/en-us/library/ms190309 .aspx)). z.B. '24 * 7 'kann nicht in ein Datum und/oder eine Uhrzeit umgewandelt werden. – ZLK

+0

(Eine mögliche Lösung besteht darin, Ihre 'r.Breakfast_OpenTime' als VARCHAR in der ersten case-Anweisung zu interpretieren). – ZLK

+0

Behebung dieses Problems durch Ändern der ersten Fallanweisung durch CASE WHEN r.OpeningTimeType = '24 * 7 'DANN r.OpeningTimeType ELSE CONVERT (varchar (15), CAST (Frühstück_OpenTime AS TIME), 100) END AS OpenTime .thanks –

Antwort

1

CASE A in T-SQL ist eine Ausdruck die genau ein atomarer Wert zurückgibt. Daher alle verschiedene Optionen des CASE müssen zurückkehren den denselben Datentyp (oder zumindest kompatibel sind) - und das ist nicht so in Ihrem CASE hier:

CASE 
    WHEN r.OpeningTimeType IN ('24*7') 
     THEN r.OpeningTimeType 
     ELSE r.Breakfast_OpenTime 
END AS OpenTime, 

OpeningTimeTypevarchar(50) ist, während Breakfast_OpenTime von ist Geben Sie time ein. Daher muss SQL Server einen Wert in den allgemeinen Rückgabetyp konvertieren.

Basierend auf der SQL Server type precedence, wird es versuchen, beide mögliche Rückgabewerte in TIME konvertieren und das ist, wo es fehlschlägt.

Also, um dieses Problem zu beheben, ist es bis zu Sie um sicherzustellen, dass die CASE Variationen alle den denselben Datentyp, so dass keine impliziten Konvertierungen ergreifen müssen, um Platz zurückzukehren. Da kann man natürlich nicht garantieren, dass OpeningTimeType zu einem TIME umgewandelt werden kann, müssen Sie das Gegenteil tun - wandeln die Breakfast_OpenTime auf einen VARCHAR(50):

CASE 
    WHEN r.OpeningTimeType IN ('24*7') 
     THEN r.OpeningTimeType 
     ELSE CAST(r.Breakfast_OpenTime AS VARCHAR(50)) 
END AS OpenTime, 
Verwandte Themen