我的数据库出现问题,因为它的审计工作正在进行,而且事情很艰难。我需要将当前更改与上次更改进行比较,因此我认为我将包含一个分组列。但是当我运行我的代码时,一些列值是。它是1,2,3,4,5,6,7,8,9,。什么... idon'tevenknow?
这就是我正在做的事情:
DECLARE @Person char(11), @DonationYTD decimal(10, 2), @OldPerson char(11), @OldDonationYTD decimal(10, 2), @Group int;
SET @Group=1;
DECLARE TempCursor CURSOR FOR Select PersonID, DonationYTD FROM MyTable;
OPEN TempCursor;
FETCH NEXT FROM TempCursor INTO @Person, @DonationYTD ;
WHILE @@FETCH_STATUS=0
BEGIN
IF( @Person != @OldPerson)
SET @Group=1;
IF( @Person = @OldPerson AND @DonationYTD!=@OldDonationYTD)
SET @Group=@Group+1;
UPDATE MyTable SET CHANGEGROUP=@Group WHERE PersonID=@Person AND DonationYTD=@DonationYTD;
SET @OldPerson = @Person;
SET @OldDonationYTD = @DonationYTD;
FETCH NEXT FROM TempCursor INTO @Person, @DonationYTD ;
END
CLOSE TempCursor;
DEALLOCATE TempCursor;
SELECT PersonID, DonationYTD, Changegroup FROM MyTable
1 15.00 1
1 15.00 1
1 20.00 1
2 3.00 1
2 4.00 2
2 15.00 3
2 8.00 4
2 4.00 5
2 15.00 6
2 3.00 7
2 3.00 7
2 9.00 8
2 9.00 8
2 10.00 9
2 14.00 *
2 14.00 *
如果我尝试对Changegroup做任何事情,它会告诉我它无法将varchar符号*转换为整数。 我为什么要收到星号?我该如何解决?
答案 0 :(得分:1)
您遇到问题described here
当整数被隐式转换为字符数据类型时,如果 整数太大,无法放入字符字段SQL Server 输入ASCII字符42,星号(*)。
我从中推断出您的专栏必须是[var]char(1)
。对于较新的n [var] char类型as discussed here,不会发生这种奇怪的行为。
修复方法是更改列数据类型。理想情况下,对于int
这样的数值数据类型,但如果它必须至少有一个字符串足够长,以容纳预期的内容。