1、在sybase11.5中,組合兩個定長的 char(x)="aaa",char (y)="bbb"; char(x)+char(y)!="aaabbb"
declare @val_1 char(8)
declare @val_2 char(1)
select @val_2 = ’x’
select @val_1 = "0000"
select @var_1= @val_1 + @val_2
select @var_1
我們期望的結果為0000x, 而實際上其結果為0000。
解決方法一:當我們將"select @var_1=@val_1+@val_2",改為"select @var_1=rtrim(@var_1)+@var_2"時,我們便看到了我們所期望的結果。為什么呢?在有的SYBASE版本中存儲一個char(n)時,在其真實值后補上了相應數量的空格,在本例中,存儲在@var_1中的是0000 (在0000后有四個空格)。你可以加上如下兩句來驗證:
declare @val3 char(10)
select @val3 = @val_1 + @val_2
select @val3
這時你會得到的結果為0000 x (在0000后有四個空格)。
解決方法二:將char 改為 varchar 也可以達到預期的目的。
2、用alter table 增加表結構時,雖然用sp_recompile tablename 重編譯了所影響的數據庫對象,但在運行某些包含"select * from tablename"的存儲過程時,存儲進程仍不認識用alter table 增加的列。例:
1> create table tmp(aa int,bb int)
2> go
1> create table b_tmp(aa int,bb int)
2>go
1> create proc tmpstore
2> as
1> insert b_tmp select * from tmp
2> return
3> go
1> alter table tmp add cc char(8) null
2> go
1> alter table b_tmp add cc char(8) null
2> go
1> sp_recompile tmp
2> go
1>insert tmp values(12,1234,"abcdefg")
2>go
1> exec tmpstore
2> go
1> select * from b_tmp
2> go
aabbcc
----------- ------------- -------------
121234NULL
為什么cc字段是NULL,而不是"abcdefg"? 用alter table 增加表結構后,包含"select * from tablename"的存儲過程,用sp_recompile tablename 重編譯仍不能使新增的列被存儲過程所識別。解決辦法只有一個:刪了重建。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/