【问题标题】:SQL, CONVERT, CAST Data Type?SQL、CONVERT、CAST 数据类型?
【发布时间】:2017-06-27 22:31:34
【问题描述】:

我不确定如何在此脚本中使用 CAST 或 CONVERT。
SQL 说:

将 varchar 值 'Amazing' 转换为数据时转换失败 输入整数。

谁能告诉我怎么做?

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

【问题讨论】:

    标签: sql casting type-conversion sql-convert


    【解决方案1】:

    试试这个

    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】:

      在您的示例中,CASE 语句假定每个WHEN 子句的返回数据类型为INT,因为第一个WHEN..THEN 返回number

      SQL Server 认为在第三个WHEN..THEN,结果将是INT 和第一个和第二个一样。

      您通过在第三个 WHEN..THEN 中返回 varchar 数据类型来打破 SQL Server 的假设,这是不正确的。 Amazing 不能转换为 INT

      CASE 语句中的所有路径都应返回相同的数据类型。

      【讨论】:

      • 能否请您举例说明如何在脚本方面进行此更改?
      • 另一个答案应该适合你。只需将其他 2 条路径转换为返回 varchar 而不是 number
      猜你喜欢
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多