无法使用过程

时间:2017-06-09 17:07:02

标签: sql sql-server tsql

这不重复。

我明白这个问题意味着什么,但我不明白为什么因为变量包含数据。我基本上试图单独增加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

3 个答案:

答案 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)