问题
I am not sure how to use either CAST or CONVERT in this script.
SQL says:
Conversion failed when converting the varchar value 'Amazing' to data type int.
Can someone please tell me how to do this?
USE AdventureWorks2012
GO
DECLARE @Number01 AS INT
DECLARE @Number02 AS INT
DECLARE @Number03 AS INT
DECLARE @Number04 AS INT
DECLARE @Number05 AS INT
DECLARE @Number06 AS INT
DECLARE @Number07 AS INT
DECLARE @Text01 AS VARCHAR (15)
SET @Number01 = 150
SET @Number02 = 200
SET @Number03 = 350
SET @Number04 = 450
SET @Number05 = 550
SET @Number06 = 650
SET @Number07 = 800
SET @Text01 = 'Amazing'
SELECT A.ProductID ,A.Name ,A.ProductModelID ,A.ProductNumber ,A.MakeFlag ,A.Color ,A.SafetyStockLevel
,A.StandardCost ,A.ListPrice,A.DaysToManufacture ,A.SellEndDate ,A.ModifiedDate ,A.ListPrice
,B.Name ,B.ListPrice ,B.Adjusted_List_Price ,C.ProductDescriptionID ,C.Description
,C.ModifiedDate ,D.ProductID ,D.StartDate ,D.EndDate ,D.ListPrice ,D.ModifiedDate, E.Name
,E.CatalogDescription,E.ModifiedDate ,F.ReferenceOrderID ,F.TransactionDate
,F.TransactionID ,F.Quantity
,IIF(A.ListPrice >=@Number01,CAST((@Number01 *@Number02 + @Number03) AS nvarchar(50)), 100 + @Number01) AS [Test90]
,IIF(A.ListPrice >=@Number02,CAST((@Number01 *@Number02 + @Number03) AS nvarchar(50)), 'GG') AS [Test91]
,PATINDEX('%M94B%', A.ProductNumber) AS [Test92]
,PATINDEX('%M63S%', A.ProductNumber) AS [Test94]
,CASE
WHEN A.ProductNumber LIKE '%M94B%' THEN PATINDEX('%M94B%', A.ProductNumber) * 2
WHEN A.ProductNumber LIKE '%M63S%' THEN 5 * @Number01
WHEN A.ProductNumber LIKE '%T98U%' THEN @Text01
END AS [Test95]
FROM [Production].[Product] AS A
INNER JOIN [Production].[Product_2] AS B
ON A.Name = B.Name
INNER JOIN [Production].[ProductDescription] AS C
ON A.ProductID = C.ProductDescriptionID
INNER JOIN [Production].[ProductListPriceHistory] AS D
ON A.ProductID = D.ProductID
INNER JOIN [Production].[ProductModel] AS E
ON A.ProductModelID = E.ProductModelID
FULL JOIN [Production].[TransactionHistory] AS F
ON A.ProductID = F.ProductID
WHERE A.ProductModelID IS NOT NULL
AND A.Color IS NOT NULL AND F.Quantity IS NOT NULL
回答1:
try this
USE AdventureWorks2012
GO
DECLARE @Number01 AS INT
DECLARE @Number02 AS INT
DECLARE @Number03 AS INT
DECLARE @Number04 AS INT
DECLARE @Number05 AS INT
DECLARE @Number06 AS INT
DECLARE @Number07 AS INT
DECLARE @Text01 AS VARCHAR (15)
SET @Number01 = 150
SET @Number02 = 200
SET @Number03 = 350
SET @Number04 = 450
SET @Number05 = 550
SET @Number06 = 650
SET @Number07 = 800
SET @Text01 = 'Amazing'
SELECT A.ProductID ,A.Name ,A.ProductModelID ,A.ProductNumber ,A.MakeFlag ,A.Color ,A.SafetyStockLevel
,A.StandardCost ,A.ListPrice,A.DaysToManufacture ,A.SellEndDate ,A.ModifiedDate ,A.ListPrice
,B.Name ,B.ListPrice ,B.Adjusted_List_Price ,C.ProductDescriptionID ,C.Description
,C.ModifiedDate ,D.ProductID ,D.StartDate ,D.EndDate ,D.ListPrice ,D.ModifiedDate, E.Name
,E.CatalogDescription,E.ModifiedDate ,F.ReferenceOrderID ,F.TransactionDate
,F.TransactionID ,F.Quantity
,IIF(A.ListPrice >=@Number01,CAST((@Number01 *@Number02 + @Number03) AS nvarchar(50)), 100 + @Number01) AS [Test90]
,IIF(A.ListPrice >=@Number02,CAST((@Number01 *@Number02 + @Number03) AS nvarchar(50)), 'GG') AS [Test91]
,PATINDEX('%M94B%', A.ProductNumber) AS [Test92]
,PATINDEX('%M63S%', A.ProductNumber) AS [Test94]
,CASE
WHEN A.ProductNumber LIKE '%M94B%' THEN cast(PATINDEX('%M94B%', A.ProductNumber) * 2 as varchar(100))
WHEN A.ProductNumber LIKE '%M63S%' THEN cast( 5 * @Number01 as varchar(100))
WHEN A.ProductNumber LIKE '%T98U%' THEN @Text01
END AS [Test95]
FROM [Production].[Product] AS A
INNER JOIN [Production].[Product_2] AS B
ON A.Name = B.Name
INNER JOIN [Production].[ProductDescription] AS C
ON A.ProductID = C.ProductDescriptionID
INNER JOIN [Production].[ProductListPriceHistory] AS D
ON A.ProductID = D.ProductID
INNER JOIN [Production].[ProductModel] AS E
ON A.ProductModelID = E.ProductModelID
FULL JOIN [Production].[TransactionHistory] AS F
ON A.ProductID = F.ProductID
WHERE A.ProductModelID IS NOT NULL
AND A.Color IS NOT NULL AND F.Quantity IS NOT NULL
回答2:
In your sample, the CASE statement assumes the returned data type for each WHEN clause is INT, because the first WHEN..THEN returns number.
SQL Server thinks in the 3rd WHEN..THEN, the result will be INT like the first and second.
You are breaking the assumption of SQL Server by returning a varchar data type in the 3rd WHEN..THEN and this is not right. Amazing is not convertible to INT
All paths in CASE statement should return the same data type.
来源:https://stackoverflow.com/questions/44790948/sql-convert-cast-data-type