国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 数据库 > sybase > SYBASE数据库操作笔记

SYBASE数据库操作笔记

来源:程序员人生   发布时间:2013-10-10 01:17:55 阅读次数:3687次
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 sybasecharsetscp936 2.c:sybasecharsetscp936> 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_5in目录
 
执行命令: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服务两次(第一次启动会失败),启动服务。
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生