【发布时间】:2013-07-08 05:28:50
【问题描述】:
我编写了应该返回值的存储过程-
J1
J2
J3
我有一个名为Journal_Entry 的表。当表的行数为 0 时,它会给出结果J1,但随着行数的增加,它会显示错误-
"Conversion failed when converting the varchar value 'J' to data type int."
#这里的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
【问题讨论】:
-
如果可能的话,最好将前缀和数字存储在单独的列中 - 它使上述代码更容易编写。如果前缀始终为
J,则根本不需要存储。如果你真的需要的话,你总是可以创建一个计算列,将它们组合成一个列。 -
我也很难理解为什么您要将
CASTMAX结果返回 到varchar,只是为了,在下一行,@ 987654331@它回int。 -
实际上我需要结果为 J1,J2 以便它可以在应用程序中显示为凭证号,也可以存储在单列中。
-
您的数据库结构不应围绕您的显示 或格式 要求。从逻辑上讲,数字和前缀是您要对其执行处理的两个单独的数据项 - 它们应该位于单独的列中。
标签: sql-server tsql sqldatatypes