Sybase程序設(shè)計(jì)中極易造成誤解的內(nèi)部規(guī)則

字號(hào):

SYBASE 數(shù)據(jù)庫是當(dāng)今在UNIX環(huán)境下最為流行的大型數(shù)據(jù)庫之一,本人在SYBASE下開發(fā)和維護(hù)軟件的過程中,發(fā)現(xiàn)了一些SYBASE的內(nèi)部規(guī)則,在程序設(shè)計(jì)中極易造成誤解,而達(dá)不到預(yù)期的目的。下文將本人所發(fā)現(xiàn)的幾個(gè)問題及其解決辦法敘述如下:
    ◆1、在sybase11.5中,組合兩個(gè)定長(zhǎng)的 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
    我們期望的結(jié)果為0000x, 而實(shí)際上其結(jié)果為0000。
    解決方法一:當(dāng)我們將"select @var_1=@val_1+@val_2",改為"select @var_1=rtrim(@var_1)+@var_2"時(shí),我們便看到了我們所期望的結(jié)果。為什么呢?在有的SYBASE版本中存儲(chǔ)一個(gè)char(n)時(shí),在其真實(shí)值后補(bǔ)上了相應(yīng)數(shù)量的空格,在本例中,存儲(chǔ)在@var_1中的是0000 (在0000后有四個(gè)空格)。你可以加上如下兩句來驗(yàn)證:
    declare @val3 char(10)
    select @val3 = @val_1 + @val_2
    select @val3
    這時(shí)你會(huì)得到的結(jié)果為0000 x (在0000后有四個(gè)空格)。
    解決方法二:將char 改為 varchar 也可以達(dá)到預(yù)期的目的。
    ◆2、用alter table 增加表結(jié)構(gòu)時(shí),雖然用sp_recompile tablename 重編譯了所影響的數(shù)據(jù)庫對(duì)象,但在運(yùn)行某些包含"select * from tablename"的存儲(chǔ)過程時(shí),存儲(chǔ)進(jìn)程仍不認(rèn)識(shí)用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
    aa      bb      cc
    ----------- ------------- -------------
    12      1234     NULL
    為什么cc字段是NULL,而不是"abcdefg"? 用alter table 增加表結(jié)構(gòu)后,包含"select * from tablename"的存儲(chǔ)過程,用sp_recompile
    tablename 重編譯仍不能使新增的列被存儲(chǔ)過程所識(shí)別。解決辦法只有一個(gè):刪了重建。