任何人都可以确定我的循环无法正常工作的原因吗?

时间:2016-12-16 15:28:06

标签: sql-server tsql

我正在尝试执行插入操作,以便在clientID值为NULL时将客户端数据插入到客户端表中。

我有一个循环遍历输入临时表的数据,当clientID为null时,它应该执行插入并为该客户端选择下一个顺序客户端引用,然后从临时表中删除该行并移到下一个。

问题是当循环执行第二次或更多插入时,即使我已指定+1,它也使用SAME客户端引用。下面是循环的摘录,任何人都可以找出为什么在第一次插入后客户端引用保持不变?如果我自己用循环运行插入并选择@result它会顺序显示vaues,所以我不明白为什么当脚本运行时它不会顺序插入引用。

  Declare @Id int
WHILE EXISTS(SELECT * FROM #Temp)
begin
select top 1 @id = ID from #temp

IF (select clientID from #m1 where id = @id) is null AND  (select renewalinsuredid from #m1 where id=@id) is not null and (select renewalmasterID from #m1 where id=@id) is not null 
BEGIN
declare @result varchar(10)
SELECT @Result = (MAX(CAST(SUBSTRING(ClientReference1,3,6) AS INTEGER)) + 1) FROM Client
set @result = 'CR0' + @result

INSERT INTO Client (clientid,InsuredName,InsuredId,MasterInsuredId,ClientReference1)
SELECT newid(),insuredname,RenewalInsuredID,RenewalMasterID,@result from #M1 where id = @id

PRINT 'Client ref '+ cast(@result as varchar(64))  +' inserted for policy ' + @result2
END



DELETE from #temp where ID = @Id
END

2 个答案:

答案 0 :(得分:0)

你做了......

SELECT @Result = (MAX(CAST(SUBSTRING(ClientReference1,3,6) AS INTEGER)) + 1) FROM Client

...要获得最大客户端引用CAST为整数,然后将1加1 - 这并不能保证@Result更大'比所有其他ClientReference1,因为ClientReference1似乎是一个文本字段 - 考​​虑一个字段' 9',将其转换为整数,并添加1 - 你有什么? A 10 - 如果我改回文本,那么' 10' < ' 9'在字母数字方面

从数字到字符串的交换,以及已经更改为字符串的数字排序,可能会产生不良影响。您还要添加' CR0'到字符串的开头,这可能会使事情变得混乱。

答案 1 :(得分:0)

所以我在转换价值后设法让它工作。这似乎是由于数据类型为int,因为当转换为varchar时,insert正常工作。我不明白的主要是如果我只是选择@result来查看输出是什么 - 它每次都是正确的,只是似乎没有正确插入值。谢谢你的帮助。

 declare @result varchar(10)
     declare   @Length         int
     declare    @Refresult      varchar(10)

SELECT @Result = (MAX(CAST(SUBSTRING(ClientReference1,3,6) AS INTEGER)) + 1) FROM Client
   SET    @Length =  CONVERT(INT,@Result)
   SET    @Result =  CONVERT(VARCHAR(10),@Length)
   SET    @Length =  LEN(@Result)
 IF(@Length =5)
      SET @Result = '0' + @Result
    IF @Result IS NULL
    BEGIN
        SET @Result = '00000' + '1'
    END
SET @Refresult = 'CR' + @Result