将varchar值转换为sql中的数据类型int时转换失败

nar*_*ren 7 t-sql sql-server sqldatatypes

我写了商店程序,它应该返回如下的值:

J1
J2
J3
Run Code Online (Sandbox Code Playgroud)

我有桌子命名Journal_Entry.当表的行数为0时,它会给出结果,J1但随着行数增加,它会显示错误 -

"Conversion failed when converting the varchar value 'J' to data type int."
Run Code Online (Sandbox Code Playgroud)

#here Voucher_No是要保存的结果列.

代码如下 -

CREATE PROC [dbo].[getVoucherNo]
AS
BEGIN
    DECLARE @Prefix VARCHAR(10)='J'
    DECLARE @startFrom INT=1
    DECLARE @maxCode VARCHAR(100)
    DECLARE @sCode INT
    IF((SELECT COUNT(*) FROM dbo.Journal_Entry) > 0)
    BEGIN
        SELECT @maxCode = CAST(MAX(CAST(SUBSTRING(Voucher_No,LEN(@startFrom)+1,LEN(Voucher_No)- LEN(@Prefix)) AS INT)) AS varchar(100)) FROM dbo.Journal_Entry;
        SET @sCode=CAST(@maxCode AS INT)
        SELECT  @Prefix + LEN(CAST(@maxCode AS VARCHAR(10))+1) + CAST(@maxCode AS VARCHAR(100))
    END
    ELSE
    BEGIN
        SELECT(@Prefix + CAST(@startFrom AS VARCHAR)) 
    END

END
Run Code Online (Sandbox Code Playgroud)

小智 5

问题位于以下行

SELECT  @Prefix + LEN(CAST(@maxCode AS VARCHAR(10))+1) + CAST(@maxCode AS VARCHAR(100))
Run Code Online (Sandbox Code Playgroud)

请改用它

SELECT  @Prefix + CAST(LEN(CAST(@maxCode AS VARCHAR(10))+1) AS VARCHAR(100)) + CAST(@maxCode AS VARCHAR(100))
Run Code Online (Sandbox Code Playgroud)

完整代码:

CREATE PROC [dbo].[getVoucherNo]

AS

BEGIN

    DECLARE @Prefix VARCHAR(10)='J'

    DECLARE @startFrom INT=1

    DECLARE @maxCode VARCHAR(100)

    DECLARE @sCode INT

    IF((SELECT COUNT(*) FROM dbo.Journal_Entry) > 0)
    BEGIN
        SELECT @maxCode = CAST(MAX(CAST(SUBSTRING(VoucharNo,LEN(@startFrom)+1,LEN(VoucharNo)- LEN(@Prefix)) AS INT))+1 AS varchar(100)) FROM dbo.Journal_Entry;
        SET @sCode=CAST(@maxCode AS INT)
        SELECT  @Prefix + CAST(LEN(CAST(@maxCode AS VARCHAR(10))+1) AS VARCHAR(100)) + CAST(@maxCode AS VARCHAR(100))
    END
    ELSE
    BEGIN
        SELECT(@Prefix + CAST(@startFrom AS VARCHAR)) 
    END
END
Run Code Online (Sandbox Code Playgroud)


liv*_*ove 5

我收到了同样的错误消息.就我而言,这是由于没有使用引号.

虽然该列应该只有数字,但它是一个Varchar列,其中一行中有一个字母.

所以我这样做:

select * from mytable where myid = 1234
Run Code Online (Sandbox Code Playgroud)

虽然我应该这样做:

select * from mytable where myid = '1234'
Run Code Online (Sandbox Code Playgroud)

如果列具有所有数字,则转换将起作用,但在这种情况下不起作用.