程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> 快速解決SYBASE編程中所遇到的莫名錯誤

快速解決SYBASE編程中所遇到的莫名錯誤

編輯:SyBase綜合文章

Sybase 數據庫是當今在UNIX環境下最為流行的大型數據庫之一,本人在SYBASE下開發和維護軟件的過程中,發現了一些Sybase的內部規則,在程序設計中極易造成誤解,而達不到預期的目的。下文將本人所發現的幾個問題及其解決辦法敘述如下:

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 
aa      bb      cc 
----------- ------------- ------------- 
12      1234     NULL

 

為什麼cc字段是NULL,而不是"abcdefg"? 用alter table 增加表結構後,包含"select * from tablename"的存儲過程,用sp_recompile tablename 重編譯仍不能使新增的列被存儲過程所識別。解決辦法只有一個:刪掉後重建。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved