转换失败:将 nvarchar 值转换为 int 数据类型时

问题描述 投票:0回答:3

我创建一个存储过程

CREATE PROCEDURE [dbo].[wsp_Display_Invoice]
     @DOID NVARCHAR(50),
     @brcode INT
AS
BEGIN
    SELECT DISTINCT 
        A.Item_Code,
        (B.Description + '-' + B.Product_Code + '(' + D.Brand_Name+ ')') AS Description,
        A.Quantity, B.UOM, A.Rate, A.DOID,
        C.Doc_No, B.Tax_Percentage AS Tax, B.Tax_Percentage AS Tax1,
        F.QuotationID
    FROM 
        DO_T A 
    INNER JOIN 
        inv_Item_Master B ON A.Item_Code = B.Item_Code 
    INNER JOIN 
        DO C ON A.DOID = C.DOID 
    INNER JOIN 
        Inv_Brand D ON D.Brand_ID = B.Brand_ID 
    INNER JOIN 
        Quotation_T F ON F.DOID = A.DOID 
    WHERE 
        A.DOID LIKE '%' + @DOID + '%' 
        AND a.BR_Code = @brcode
END

出现错误

将 nvarchar 值“22,23”转换为数据类型 int 时转换失败。

sql sql-server stored-procedures type-conversion
3个回答
1
投票

您的代码正在某处进行隐式转换。明显的地方是与

+
的字符串连接。如果任何参数是数字,则
+
会被解释为数字加法——并且您会收到错误。

不太明显的地方是其他操作,比如

JOIN
条件。如果一列是字符串,另一列是数字,那么 SQL Server 会尝试将该字符串转换为数字——并且您可能会收到错误。

所以,我会尝试以下方法。

更换:

   (B.Description + '-' + B.Product_Code + '(' + D.Brand_Name+ ')') AS Description,

与:

   (B.Description + '-' + CAST(B.Product_Code as VARCHAR(255)) + '(' + D.Brand_Name+ ')') AS Description,

仅当

Product_Code
是数字时才需要。

A.DOID LIKE '%' + @DOID + '%'

与:

CAST(A.DOID as VARCHAR(255)) LIKE '%' + @DOID + '%'

这只需要

A.DOID
是一个数字。

@brcode
的类型更改为字符串。仅当
a_BR_CODE
是数字时才需要这样做。

如果这些不起作用,您将必须查看

JOIN
条件,看看其中是否有任何混合类型。


0
投票

我还认为我们需要知道各个表中DOID字段的数据类型。我的猜测是其中一个连接上存在数据类型不匹配。


-1
投票

尝试以下操作:

CREATE PROCEDURE [dbo].[wsp_Display_Invoice]
     @DOID NVARCHAR(50),
     @brcode INT
AS
BEGIN
    SELECT DISTINCT 
        A.Item_Code,
        (B.Description + '-' + B.Product_Code + '(' + D.Brand_Name+ ')') AS Description,
        A.Quantity, B.UOM, A.Rate, A.DOID,
        C.Doc_No, B.Tax_Percentage AS Tax, B.Tax_Percentage AS Tax1,
        F.QuotationID
    FROM 
        DO_T A 
    INNER JOIN 
        inv_Item_Master B ON A.Item_Code = B.Item_Code 
    INNER JOIN 
        DO C ON A.DOID = C.DOID 
    INNER JOIN 
        Inv_Brand D ON D.Brand_ID = B.Brand_ID 
    INNER JOIN 
        Quotation_T F ON F.DOID = A.DOID 
    WHERE 
        CONVERT(varchar(50), A.DOID) LIKE '%' + @DOID + '%' 
        AND a.BR_Code = @brcode
END
© www.soinside.com 2019 - 2024. All rights reserved.