这不重复。
我明白这个问题意味着什么,但我不明白为什么因为变量包含数据。我基本上试图单独增加char(4)列(就像整数的标识一样)。如果表格中没有任何内容,则第一个值为'C001',否则,它只是根据最后一个记录增加。
CREATE PROCEDURE ADD_CL(@nom VARCHAR(20),
@dn DATE)
AS
BEGIN
DECLARE @B CHAR(4)
DECLARE @B_to_int INT
DECLARE @B_new_value CHAR(4)
IF EXISTS(SELECT TOP 1 *
FROM CLIENT)
SET @B_new_value = 'C001'
ELSE
BEGIN
SELECT TOP 1 @B = code_client
FROM client
ORDER BY code_client DESC
SET @B_to_int = CAST(SUBSTRING(@B, 2, 3) AS INTEGER)
SET @B_to_int = @B_to_int + 1;
SET @B_new_value = LEFT(@B, 1) + RIGHT('00' + CAST(@B_to_int AS INT), 3)
END
INSERT INTO CLIENT
VALUES (@B_new_value,
@nom,
@dn)
END
无法将值NULL插入列'code_client',表'dbo.CLIENT';列不允许空值。 INSERT失败。
@B_new_value代表code_client
答案 0 :(得分:2)
您的If Exists
应为If Not Exists
。
所以改变
if exists(select TOP 1 * from CLIENT)
到
if not exists(select TOP 1 * from CLIENT)
此外,您要将00
添加到投标为@B_to_int
的最终int
。所以它会显示C2,C3
等等。
如果要保留相同的格式,请将其强制转换为varchar
SET @B_new_value = LEFT(@ B,1)+'00'+ CAST(@B_to_int as varchar)
上面的行只会在计数为9之前有效,然后它会继续用1复制,因为10将是0010
,最终输出将是C0010
。要消除此问题,请使用复制并复制0
,直到3个字符。
SET @B_new_value = LEFT(@B,1) + REPLICATE('0',3-LEN(@B_to_int)) + @B_to_int
祝你好运。
答案 1 :(得分:2)
其他答案已经告诉您,您应该使用NOT EXISTS
。
这种编号方案很可能是你会后悔的,但你可以简化这一点,并使其在并发条件下更加安全,以及只是通过执行操作而耗尽数字
CREATE PROCEDURE ADD_CL(@nom VARCHAR(20),
@dn DATE)
AS
BEGIN
DECLARE @B VARCHAR(5);
SET XACT_ABORT ON;
BEGIN TRAN
SELECT @B = FORMAT(1 + RIGHT(ISNULL(MAX(code_client), 'C000'), 3), '\C000')
FROM CLIENT WITH(ROWLOCK, UPDLOCK, HOLDLOCK);
IF ( LEN(@B) > 4 )
THROW 50000, 'Exceeded range',1;
INSERT INTO CLIENT
VALUES (@B,
@nom,
@dn);
COMMIT
END
答案 2 :(得分:0)
我认为以下应该是“不存在”
if EXISTS(select TOP 1 * from CLIENT)