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è):刪了重建。
◆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è):刪了重建。