社区
Sybase
帖子详情
从syscolumns得到的列怎样才能对应systypes得到列的名称
magicsnake
2004-12-24 11:14:13
我使用syscolumns中的type,usertype与systypes中的type,usertype对应,有些列类型在systypes找不到,比如我有这样一个列:
XSSR numeric(12,2) null
我根据表id和列名称在syscolumns找到的记录对应的type=108,usertype=10
但是在systypes中type=108的只有一条记录,他的usertype=28
这个问题怎么解决?
...全文
182
2
打赏
收藏
从syscolumns得到的列怎样才能对应systypes得到列的名称
我使用syscolumns中的type,usertype与systypes中的type,usertype对应,有些列类型在systypes找不到,比如我有这样一个列: XSSR numeric(12,2) null 我根据表id和列名称在syscolumns找到的记录对应的type=108,usertype=10 但是在systypes中type=108的只有一条记录,他的usertype=28 这个问题怎么解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wgzymzx
2004-12-25
打赏
举报
回复
/********************************************
/* 用于取得表定义: 只能取得表的字段定义
/* 包括字段名,数据类型,数据长度、精度,默认值,是否允许为空,唯一约束关系
/* 需要6个参数:
/* 浣熊 2004-11-2
*********************************************/
import java.util.*;
import java.sql.*;
public class TableDDL
{
public static String getDDL(String HostIp,String Port,String DbName,String UserID,String PassWD,String TableName)
{
String dbUrl="jdbc:sybase:Tds:"+HostIp+":"+Port+"/"+DbName;
String DBDriver = "com.sybase.jdbc2.jdbc.SybDriver";
String sql="";
String str="",str2="";
String s1="";
int i,j,k,flag=0;
try
{
//取得表的DDL定义
sql=" select C.name, "+
" isnull(X.xtname, isnull(get_xtypename(C.xtype,C.xdbid), T.name)), "+
" C.length, "+
" C.prec, "+
" C.scale, "+
" C.status, "+
" T.usertype ,"+
" (select text FROM syscomments D,sysprocedures P "+
" WHERE D.id = C.cdefault AND P.id = D.id "+
" AND P.sequence = 0 AND P.status & 4096 = 4096) "+
" FROM syscolumns C, systypes T, sysxtypes X, sysobjects O "+
" WHERE C.usertype *= T.usertype "+
" AND C.xtype *= X.xtid "+
" AND C.id = O.id "+
" AND O.name = '"+TableName+"' "+
" AND O.type = 'U' "+
" ORDER BY C.colid ";
Class.forName(DBDriver);
Connection conn=DriverManager.getConnection(dbUrl,UserID,PassWD);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
while(rs!=null && rs.next())
{
flag=1; //该表存在
str=str+AddSpace(rs.getString(1),35); //字段名
s1=rs.getString(2); //字段类型
//定义字段长度、精度
str2="";
if(s1.equals("binary") || s1.equals("char") || s1.equals("nchar") || s1.equals("nvarchar") || s1.equals("unichar") || s1.equals("univarchar") || s1.equals("varbinary") || s1.equals("varchar"))
str2 = str2 + "(" + rs.getString(3) + ")";
if(s1.equals("float"))
{
i = (new Integer(rs.getString(3))).intValue();
str2 = str2 + "(" + i * 2 + ")";
}
if(rs.getInt(7)<=100)
{
if(rs.getString(4)!=null && rs.getString(5)!=null)
{
if(!rs.getString(4).equals("") && !rs.getString(5).equals(""))
str2 = str2 + "(" + rs.getString(4) + "," + rs.getString(5) + ")";
}
}
str=str+AddSpace(s1+str2,20);
//定义字段是否有默认值,是否允许为空,
if(rs.getString(8)!=null)
{
str = str+rs.getString(8);
}
else
{
if(rs.getInt(6) == 0)
str = str +"not null";
else
if((rs.getInt(6) & 0x80) == 128)
str = str + "identity";
else
str = str + "null";
}
str = str+",\r\n";
}
if(conn!=null) conn.close();
if(flag==0) return "";
//定义主键和唯一约束关系
sql = " select b.keycnt, b.name, b.indid, b.status, b.status2 "+
" from sysobjects a, sysindexes b "+
" where a.id=b.id and a.type='U' and b.indid>0 "+
" and b.status2&2=2 and a.name='"+TableName+"'";
Class.forName(DBDriver);
Connection conn2=DriverManager.getConnection(dbUrl,UserID,PassWD);
Statement stmt2=conn2.createStatement();
ResultSet rs2=stmt2.executeQuery(sql);
while(rs2!=null && rs2.next())
{
str=str+"CONSTRAINT ";
str=str+rs2.getString(2)+" ";
if((rs2.getInt(4)&0x800) == 2048)
str=str+" PRIMARY KEY ";
else
str=str+" UNIQUE ";
j=0;
if(rs2.getInt(3)==1)
{
str=str+" CLUSTERED ";
j=rs2.getInt(1)+1;
}
if(rs2.getInt(3) > 1)
if((rs2.getInt(5)&0x200) == 512)
{
str=str+" CLUSTERED ";
j=rs2.getInt(1)+1;
}
else
{
str=str+" NONCLUSTERED ";
j=rs2.getInt(1);
}
str=str+" ( ";
for(k=1;k<j;k++)
{
sql=" select index_col('"+TableName+"',"+rs2.getInt(3)+","+k+")";
Class.forName(DBDriver);
Connection conn3=DriverManager.getConnection(dbUrl,UserID,PassWD);
Statement stmt3=conn3.createStatement();
ResultSet rs3=stmt3.executeQuery(sql);
while(rs3!=null && rs3.next())
str=str+rs3.getString(1)+",";
if(conn3!=null) conn3.close();
}
str=str.substring(0,str.length()-1)+"),\r\n";
}
if(conn2!=null) conn2.close();
str = str.substring(0,str.length()-3);
str = "create table dbo."+TableName+"(\r\n"+str+"\r\n)\r\ngo\r\n";
}
catch(Exception e){
System.out.println("except:="+e.getMessage());
}
return str;
}
public static String AddSpace(String paStr,int palen)
{
int i,j;
j=paStr.length();
for(i=0;i<palen-j;i++)
paStr=paStr+" ";
return paStr;
}
}
这是我照Sybase的文档写的,可以取出表的定义,不过有限制——注释中写了。
自己看看吧,希望对你有帮助
hobbylu
2004-12-24
打赏
举报
回复
你只要使用usertype相对应的记录就可以了
sys
objects
sys
column
s和
Sys
Types
笔记
在数据库中创建的每个对象(例如约束、默认值、日志、规则以及存储过程)都
对应
一行。 常规用法:select * from
sys
objects where id= object_id('TableName') and type = 'U' 查找表TableName的信息 更多参考...
获取用户表名、所有
列
、主键
SELECT name FROM
sys
objects WHERE type = U AND
sys
stat = 83 注意:一般情况只需要type = U,但有时候会有系统表混在其中(不知道什么原因),加上后面一句后就能排除这些系统表了 2、
得到
表中的所有
列
信息...
SqlServer用户数据库的系统视图
sys
objects、
sys
column
s、
sys
types
想获得SqlServer用户数据库的Schema,本来想直接用ADO的SqlConnection对象的GetSchema()方法,但是架构中居然没有PrimaryKeys,只好借助于T-SQL语句了!在网上找到了一下的语句,可以正确执行。 查询用户表的信息 ...
SQL查询表的所有字段和表字段
对应
的类型
1.查询表的所有字段 select
sys
column
s.name from
sys
column
s where id=object_id('表名') ...select
sys
column
s.name,
sys
types
.name from
sys
column
s,
sys
types
where
sys
column
s.xusertype=
sys
types
.xu...
SQL 系统表
Sys
objects 和
Sys
Column
s 表的一些知识
sys
column
s每个表和视图中的每
列
在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。
列
名数据类型描述name
sys
name
列
名或过程参数的
名称
。idint该
列
所属的表对象 ID,或与该参数关联的存储...
Sybase
2,596
社区成员
25,614
社区内容
发帖
与我相关
我的任务
Sybase
Sybase相关技术讨论区
复制链接
扫一扫
分享
社区描述
Sybase相关技术讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章