SYBASE 數據庫操作筆記(轉自MaYong)
數據庫表名、列名(執行嚴格的大小寫)
數據庫表名、列名識別大小寫區分(即表名是大寫 查詢時小寫就錯誤)
大小寫敏感的問題是因為字符集影響的,改為UTF8字符集後問題解決。
SYBASE數據庫的缺陷(版本SYBASE ASE 15.5)(目前在使用過程中發現的數據庫本身的缺陷)
1.創建表是設置列的默認值是不會檢測的(例如一列字段的數據類型為VARCHAR,默認值可以設置為數字2,可以正常創建表成功;但是當插入數據時(不給此列插入值)就報錯啦,不能正常插入數據。)可能數據庫創建表時沒有去驗證默認值吧。
解決方案只能是自己檢查好創建語句,嚴格遵守默認值的數據類型。
2.兼容性:不會自動轉換數據類型,與上面問題類似,INT型不能插入字符型的('1'),反之一樣。這是數據庫的嚴謹性可以理解,呵呵。
3.創建表與對表操作的語句不能直接放到循環或者判斷語句中,
SYSBASE是先執行創建表的語句(看來創建表的待遇基本不是一般的高啊),
然後才執行條件的判斷,這點壓根不符合程序的邏輯性。(不知SYBASE數據庫的工程師們是怎麼想的)
解決方案,是再創建一個存儲過程,將要創建的表明傳給他,在判斷或循環是調用此存儲過程。
4.還有一些小問題暫時就不說啦。
--查詢數據庫中用戶表的名稱
SELECT name FROM sysobjects WHERE type='U' order by name
--查詢數據庫中存儲過程的名稱
SELECT name FROM sysobjects WHERE type = 'P'
--查詢數據庫中函數的名稱
SELECT name FROM sysobjects WHERE type='SF'
--執行存儲過程:exec 存儲過程名稱 第一個參數,第二個參數
exec dbo.Pro_CreateIndex js_seqsql, ssql_type
--查詢表的全部索引OBJECT_ID('表名') indid>0為索引類型
SELECT name FROM sysindexes WHERE id = OBJECT_ID('js_seqsql') and indid>0
--刪除索引 表名.索引名稱
DROP INDEX js_seqsql.js_seqsql_idx_ssql_type
--創建索引CREATE NONCLUSTERED INDEX 索引名稱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數據庫錯誤代碼:其中DESCRIPTION列即為錯誤描述,@ERROR為錯誤代碼編號,可以自行修改查詢。
SELECT * FROM MASTER.DBO.SYSMESSAGES WHEREERROR=@ERROR
-- =============================================
-- Author: MaYong
-- Create date: 2011-01-05
-- Description: 批量創建索引
-- 執行示例: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) --索引名稱
)
--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
--創建索引
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出差語句:', @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出差語句:', @index_sql
PRINT @@error
END
GO
----------------------------發現問題---------------------------------
INDEX是SYBASE數據庫的關鍵字,創建與查詢此字段時必須加[]才行,建議修改
--業務類型對應承載方式、性能指標表
PRINT '<<<<< CREATING Table - "SERVICE2NORM" >>>>>'
IF OBJECT_ID('SERVICE2NORM') IS NOT NULL
drop table SERVICE2NORM
GO
CREATE TABLE SERVICE2NORM(
ID INT IDENTITY, --標識,自動+1
SERVICETYPE VARCHAR(3), --主業務類型
SUBSERVICETYPE VARCHAR(2), --子業務類型
EXPSERVICETYPE VARCHAR(3), --拓展業務類型
LOCALNET TINYINT, --主叫承載方式
NORMID INT, --性能指標
TYPE TINYINT, --關注指標,0:關注(暫不使用)
[INDEX] INT, --序號.0:主性能;
PRIMARY KEY CLUSTERED ( ID ) ON 'default'
)
-----------------------------------------------------------------------
您正在看的sybase教程是:如何更改服務器的字符集為cp936。
(這裡SYBASE的安裝路徑為c:\sybase) 1.c:\>cd \sybase\charsets\cp936 2.c:\sybase\charsets\cp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936 3.在SQL環境中1>select name,id from syscharsets 2>go 找到name為cp936對應的id(假設為117) .1>sp_configure "default character set id,117 2>go 5.重啟server兩次
(注:第一次啟動後,server會自動宕掉,需要第二次重啟後才能使用)
如何修改Syabse服務器端的默認字符集
以Windows操作系統Sybase12.5為例:
首先說明察看服務端字符集和客戶端字符集的方法:
查看服務器端字符集:
在isql環境中執行:
1>sp_helpsort
2> go
查看客戶端字符集:
在isql環境中執行:
1> select @@client_csname
2> go
修改服務端字符集方法:
假設sybase安裝目錄為$sybase$
◆1.轉到$sybase$\ASE-12_5\bin目錄
執行命令:charset -Usa -P binary.srt iso_1
◆2.打開isql,執行下面的SQL查詢出iso_1對應的id
select id , name from syscharsets where name = 'iso_1'
go
假設查詢結果為1
執行下面語句設定默認字符集
sp_configure 'default char',1 --可能有誤,以上面的查詢結果為准
go
關閉ASE
shutdown
go
◆3.重新啟動sybase服務兩次(第一次啟動會失敗),啟動服務。