SYBASE數(shù)據(jù)庫(kù)操作筆記
來(lái)源:程序員人生 發(fā)布時(shí)間:2013-10-10 01:17:55 閱讀次數(shù):3979次
SYBASE 數(shù)據(jù)庫(kù)操作筆記(轉(zhuǎn)自MaYong)
數(shù)據(jù)庫(kù)表名、列名(執(zhí)行嚴(yán)格的大小寫(xiě))
數(shù)據(jù)庫(kù)表名、列名識(shí)別大小寫(xiě)區(qū)分(即表名是大寫(xiě) 查詢(xún)時(shí)小寫(xiě)就錯(cuò)誤)
大小寫(xiě)敏感的問(wèn)題是因?yàn)樽址绊懙?,改為UTF8字符集后問(wèn)題解決。
SYBASE數(shù)據(jù)庫(kù)的缺陷(版本SYBASE ASE 15.5)(目前在使用過(guò)程中發(fā)現(xiàn)的數(shù)據(jù)庫(kù)本身的缺陷)
1.創(chuàng)建表是設(shè)置列的默認(rèn)值是不會(huì)檢測(cè)的(例如一列字段的數(shù)據(jù)類(lèi)型為VARCHAR,默認(rèn)值可以設(shè)置為數(shù)字2,可以正常創(chuàng)建表成功;但是當(dāng)插入數(shù)據(jù)時(shí)(不給此列插入值)就報(bào)錯(cuò)啦,不能正常插入數(shù)據(jù)。)可能數(shù)據(jù)庫(kù)創(chuàng)建表時(shí)沒(méi)有去驗(yàn)證默認(rèn)值吧。
解決方案只能是自己檢查好創(chuàng)建語(yǔ)句,嚴(yán)格遵守默認(rèn)值的數(shù)據(jù)類(lèi)型。
2.兼容性:不會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型,與上面問(wèn)題類(lèi)似,INT型不能插入字符型的('1'),反之一樣。這是數(shù)據(jù)庫(kù)的嚴(yán)謹(jǐn)性可以理解,呵呵。
3.創(chuàng)建表與對(duì)表操作的語(yǔ)句不能直接放到循環(huán)或者判斷語(yǔ)句中,
SYSBASE是先執(zhí)行創(chuàng)建表的語(yǔ)句(看來(lái)創(chuàng)建表的待遇基本不是一般的高啊),
然后才執(zhí)行條件的判斷,這點(diǎn)壓根不符合程序的邏輯性。(不知SYBASE數(shù)據(jù)庫(kù)的工程師們是怎么想的)
解決方案,是再創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,將要?jiǎng)?chuàng)建的表明傳給他,在判斷或循環(huán)是調(diào)用此存儲(chǔ)過(guò)程。
4.還有一些小問(wèn)題暫時(shí)就不說(shuō)啦。
--查詢(xún)數(shù)據(jù)庫(kù)中用戶(hù)表的名稱(chēng)
SELECT name FROM sysobjects WHERE type='U' order by name
--查詢(xún)數(shù)據(jù)庫(kù)中存儲(chǔ)過(guò)程的名稱(chēng)
SELECT name FROM sysobjects WHERE type = 'P'
--查詢(xún)數(shù)據(jù)庫(kù)中函數(shù)的名稱(chēng)
SELECT name FROM sysobjects WHERE type='SF'
--執(zhí)行存儲(chǔ)過(guò)程:exec 存儲(chǔ)過(guò)程名稱(chēng) 第一個(gè)參數(shù),第二個(gè)參數(shù)
exec dbo.Pro_CreateIndex js_seqsql, ssql_type
--查詢(xún)表的全部索引OBJECT_ID('表名') indid>0為索引類(lèi)型
SELECT name FROM sysindexes WHERE id = OBJECT_ID('js_seqsql') and indid>0
--刪除索引 表名.索引名稱(chēng)
DROP INDEX js_seqsql.js_seqsql_idx_ssql_type
--創(chuàng)建索引CREATE NONCLUSTERED INDEX 索引名稱(chēng)ON 表名(列名)
CREATE NONCLUSTERED INDEX js_seqsql_idx_ssql_type ON js_seqsql(ssql_type)
--字符串替換
str_Replace(原字符串,'要替換的字符','新字符')
--判斷表是否存在
SELECT OBJECT_ID('js_jobs')
SELECT 1 FROM sysobjects o, sysusers u WHERE o.uid=u.uid AND o.name = 'WARNINFO201103' AND u.name = 'dbo' AND o.type = 'U'
--Sybase數(shù)據(jù)庫(kù)錯(cuò)誤代碼:其中DESCRIPTION列即為錯(cuò)誤描述,@ERROR為錯(cuò)誤代碼編號(hào),可以自行修改查詢(xún)。
SELECT * FROM MASTER.DBO.SYSMESSAGES WHEREERROR=@ERROR
-- =============================================
-- Author: MaYong
-- Create date: 2011-01-05
-- Description: 批量創(chuàng)建索引
-- 執(zhí)行示例:exec dbo.Pro_CreateIndex 表名,列名
-- =============================================
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'Pro_CreateIndex' AND type = 'P')
DROP PROCEDURE Pro_CreateIndex
GO
Create proc Pro_CreateIndex
(
@TableType varchar(40), --表名
@IndexName varchar(150) --索引名稱(chēng)
)
--With ENCRYPTION
AS
declare
@TableName varchar(80),
@NewIndex varchar(150)
declare tableName_Cursor CURSOR FOR
select name from dbo.sysobjects where name like @TableType+'%' and type='U' order by name
set @NewIndex = 'idx_'+str_Replace(@IndexName,',','_')
Open tableName_Cursor
Fetch next from tableName_Cursor into @TableName
if @@FETCH_STATUS <> 0
begin
DEALLOCATE tableName_Cursor
RollBack TRANSACTION
Return 0
end
while @@FETCH_STATUS = 0
BEGIN
--判斷索引是否存在 存在則刪除
declare @OldIndex varchar(150)
set @OldIndex=@TableName+'_'+@NewIndex
IF EXISTS (SELECT 1 FROM sysindexes WHERE id = OBJECT_ID(@TableName) AND name = @OldIndex and indid>0)
--IF EXISTS (SELECT 1 FROM sysindexes i, sysobjects o, sysusers u WHERE o.id = i.id AND o.uid = u.uid AND i.name = @OldIndex AND u.name = 'dbo' AND o.name = @TableName AND i.indid > 0)
BEGIN
setuser 'dbo'
declare @drop_sql varchar(1000)
select @drop_sql='DROP INDEX '+ @TableName + '.' + @OldIndex
exec (@drop_sql)
print @drop_sql
END
--異常處理
IF (@@error != 0)
BEGIN
PRINT 'Error Drop Index :', @OldIndex
SELECT syb_quit()
END
--創(chuàng)建索引
declare @index_sql varchar(1000)
select @index_sql='CREATE NONCLUSTERED INDEX'+@TableName+'_'+@NewIndex
+' ON'+@TableName+'('+@IndexName+')'
BEGIN
exec (@index_sql)
print @index_sql
END
--異常處理
IF (@@error != 0)
BEGIN
PRINT 'Error CREATING Index出差語(yǔ)句:', @index_sql
PRINT @@error
Fetch next from tableName_Cursor into @TableName
CONTINUE
END
Fetch next from tableName_Cursor into @TableName
END
Close tableName_Cursor
DEALLOCATE tableName_Cursor
--異常處理
IF (@@error != 0)
BEGIN
PRINT 'Error CREATING Index出差語(yǔ)句:', @index_sql
PRINT @@error
END
GO
----------------------------發(fā)現(xiàn)問(wèn)題---------------------------------
INDEX是SYBASE數(shù)據(jù)庫(kù)的關(guān)鍵字,創(chuàng)建與查詢(xún)此字段時(shí)必須加[]才行,建議修改
--業(yè)務(wù)類(lèi)型對(duì)應(yīng)承載方式、性能指標(biāo)表
PRINT '<<<<< CREATING Table - "SERVICE2NORM" >>>>>'
IF OBJECT_ID('SERVICE2NORM') IS NOT NULL
drop table SERVICE2NORM
GO
CREATE TABLE SERVICE2NORM(
ID INT IDENTITY, --標(biāo)識(shí),自動(dòng)+1
SERVICETYPE VARCHAR(3), --主業(yè)務(wù)類(lèi)型
SUBSERVICETYPE VARCHAR(2), --子業(yè)務(wù)類(lèi)型
EXPSERVICETYPE VARCHAR(3), --拓展業(yè)務(wù)類(lèi)型
LOCALNET TINYINT, --主叫承載方式
NORMID INT, --性能指標(biāo)
TYPE TINYINT, --關(guān)注指標(biāo),0:關(guān)注(暫不使用)
[INDEX] INT, --序號(hào).0:主性能;
PRIMARY KEY CLUSTERED ( ID ) ON 'default'
)
-----------------------------------------------------------------------
您正在看的sybase教程是:如何更改服務(wù)器的字符集為cp936。
(這里SYBASE的安裝路徑為c:sybase) 1.c:>cd sybasecharsetscp936 2.c:sybasecharsetscp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936 3.在SQL環(huán)境中1>select name,id from syscharsets 2>go 找到name為cp936對(duì)應(yīng)的id(假設(shè)為117) .1>sp_configure "default character set id,117 2>go 5.重啟server兩次
(注:第一次啟動(dòng)后,server會(huì)自動(dòng)宕掉,需要第二次重啟后才能使用)
如何修改Syabse服務(wù)器端的默認(rèn)字符集
以Windows操作系統(tǒng)Sybase12.5為例:
首先說(shuō)明察看服務(wù)端字符集和客戶(hù)端字符集的方法:
查看服務(wù)器端字符集:
在isql環(huán)境中執(zhí)行:
1>sp_helpsort
2> go
查看客戶(hù)端字符集:
在isql環(huán)境中執(zhí)行:
1> select @@client_csname
2> go
修改服務(wù)端字符集方法:
假設(shè)sybase安裝目錄為$sybase$
◆1.轉(zhuǎn)到$sybase$ASE-12_5in目錄
執(zhí)行命令:charset -Usa -P binary.srt iso_1
◆2.打開(kāi)isql,執(zhí)行下面的SQL查詢(xún)出iso_1對(duì)應(yīng)的id
select id , name from syscharsets where name = 'iso_1'
go
假設(shè)查詢(xún)結(jié)果為1
執(zhí)行下面語(yǔ)句設(shè)定默認(rèn)字符集
sp_configure 'default char',1 --可能有誤,以上面的查詢(xún)結(jié)果為準(zhǔn)
go
關(guān)閉ASE
shutdown
go
◆3.重新啟動(dòng)sybase服務(wù)兩次(第一次啟動(dòng)會(huì)失?。瑔?dòng)服務(wù)。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)