在sybase ASE中,无法使用Proxy_table命令插入

问题描述

我正在使用Sybase ASE 15.7,并且在插入具有认值的代理表时遇到问题。我们希望将数据从源表迁移到目标表,其中目标表在远程服务器中,具有“非空”和“认值”的“其他列”。请找到以下表格详细信息。

源表:

CREATE TABLE TABLE_SOURCE
(
COL1 INT,COL2 INT,COL3 INT
) 

目标表:

CREATE TABLE TABLE_TARGET
(COL1 INT,COL3 INT,COL4 INT Default 0 NOT NULL
) 

在源数据库中创建代理表:

CREATE Proxy_Table TAB_TARGET AT 'TGT_SERVER.DB.DBO.TABLE_TARGET' 

在Source中,我们提供了三列的详细信息,并以此为查询框架。

脚本:

INSERT INTO TAB_TARGET (COL1,COL2,COL3) values (1,2,3) 

错误

The column COL4 in table TAB_TARGET does not allow null values.,Error 233,Line 1 

尽管我们已经声明了COL4的认costraint,但它不通过Proxy表接受。有什么办法可以解决此问题。我们有超过5K个表用于用户迁移数据,而这个问题存在于100多个表中。

有没有办法插入目标表而没有NOT NULL问题

解决方法

以下内容显示在Reference Manual: Commands: create proxy_table用法部分:

“列默认值和规则不是由 create proxy_table 导入的;请使用 创建现有表,其中列属性可以是 定义。”

注意:此参考资料来自ASE 16手册;请参见。我在ASE 15.7 SP100手册中找不到此注释。我假设在编写ASE 15.7手册时忽略了这一细节。


由于您要处理大量表,因此我想假设您已经有了一些脚本来加速此迁移过程(并最大程度地减少了手动创建5K代理表和关联的 INSERT 语句)。

如果这个假设是正确的,并且您不希望创建5K 创建现有表命令的麻烦(完成所有讨厌的列详细信息),我想知道是否会(相对)更容易生成具有显式默认值的 INSERT 语句,例如:

INSERT INTO TAB_TARGET (COL1,COL2,COL3,COL4) values (1,2,3,0) 

关于如何在系统表中查找默认值...

  • 如果列具有默认值,则 syscolumns 中的关联记录 将在 cdefault 列中存储一个非零值,即 syscolumns.cdefault> 0
  • cdefault 的非零值是指向 syscomments 中记录的指针,该记录中存储了有关默认信息的信息,即 syscolumns.cdefault = syscomments.id
  • 实际默认值存储在以下位置的 syscomments.text 列中 取决于默认是否为 a)内联定义的两种格式之一 作为 create / alter table 命令或 b)的一部分,通过 create default 命令定义为独立的默认值。

示例:

-- inline default value of '0' assigned to column 'b'
create table t1 (a int,b int default 0 not null,c int)
go

-- standalone default named 'myzero' with default value of '0'; bound to column 'c'
create default myzero as 0
go
sp_bindefault myzero,'t1.c'
go

sp_help t1
go
...
 Column_name ... Default_name
 ----------- ... --------------
 a           ... NULL          
 b           ... t1_b_467529718             -- inline default
 c           ... myzero                     -- standalone default
...

-- contents of syscolumns.cdefault
select name,cdefault from syscolumns where id = object_id('t1') order by colid
go
 name       cdefault
 ---------- -----------
 a                    0
 b            467529718
 c            387529433

-- contents of syscomments.text
select id,text from syscomments where id in (467529718,387529433) order by id
go
 id        text
 --------- ---------------------------
 467529718 DEFAULT  0                       -- inline default
 387529433 create default myzero as 0       -- standalone default

-- pulling this all together:

select col.name,com.text
from   syscolumns  col,syscomments com
where  col.id = object_id('t1')
and    col.cdefault = com.id
order by 1
go
 name       text
 ---------- ------------------------------
 b          DEFAULT  0                      -- inline default
 c          create default myzero as 0      -- standalone default

从这里,您应该能够根据 syscomments.text 列的格式和实际的默认值(例如,它是数字吗?是字符串,可能有嵌入空间吗?它是一个函数引用,例如 getdate())。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...