Sybase Execute 不报错的问题

24-02-2013

仅仅sybase 的windows客户端有这个问题, isql 没有这个问题. select 的效果也是一样的.

执行以下代码, 若 MyTable 表已经存在, 执行会悄无声息. 不论 @sqlstr的值是什么(比如set @sqlstr=“asbsdf”), 都不会报错.

declare @sqlstr varchar(1024)
set @sqlstr =
    'create table MyTable (
        DiskId              int                 identity,
        NruId               char(32)            not null,
        DiskName            varchar(128)        null,
        LastOfflineTime     int                 null,
        constraint MyTable primary key(DiskId)
    )with identity_gap = 100'

IF NOT EXISTS(select name from sysobjects where name = 'MyTable')
EXECUTE (@sqlstr)
go

经过研究发现, 只要 set/select 一出, EXECUTE 就不与争锋了. 具体原因不明.

declare @sqlstr varchar(1024)
set @sqlstr = 'ssdf'
EXECUTE ("absc")
go

解决方法 目前暂时将语句放入EXECUTE中, 不使用set语句.

IF NOT EXISTS(select name from sysobjects where name = 'MyTable')
EXECUTE (
    'create table MyTable (
        DiskId              int                 identity,
        NruId               char(32)            not null,
        DiskName            varchar(128)        null,
        LastOfflineTime     int                 null,
        constraint MyTable primary key(DiskId)
    )with identity_gap = 100'
)
go

Read More »

Use BCP to Backup/Restore Table

24-02-2013

Backup/Export

bcp YourDBName.dbo.YourTableName out YourOutputFilePath -U YourUserName -P YourPassword -S HostNameOfYourServer -c

Restore/Import

bcp YourDBName.dbo.YourTableName in YourDatabaseTableFilePath -U YourUserName -P YourPassword -S HostNameOfYourServer -c

详细参数参考 这里

Read More »

Release reserved space after massive deletion in Sybase

23-01-2013

删除大量数据后表的 space reserved 会比较大.

可使用 reorg 来减少之.

reorg rebuild YourTableName

速度很慢的.

Read More »

Identity Gap in Sybase and SQLServer

23-01-2013

sybase中关于自增字段的一个概念 名字叫identity cache 更合适一点.默认值为500,000,000,000,000.

假定 identity_gap = 100

sybase将为你的自增字段缓存 100(identity_gap的值) 个值到内存.

比如自增字段X的当前值是1的话,sybase已经缓存1-100到内存,并将100这个数字记录到硬盘.当这100个数用完时,sybase会再分配101-200到内存,并将200这个数记录到硬盘.

如果正好意外断电了.sybase启动时就将200这个数读出来,于是分配201-300到内存.并记录300这个数到硬盘.

如果我们没有设置identity_gap的值,sybase会使用默认值500,000,000,000,000,于是断电之后就会出现500,000,000,000,001这种大数.

使用以下sql语句在创建表时设置identity_gap

create table MyRecord (......)
with identity_gap = 100
go

Read More »

Python For C++ Developers

09-09-2011