社区
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
这个问题怎么解决?
...全文
225
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
笔记
本文深入探讨了SQL Server系统表
sys
objects、
sys
column
s和
sys
types
的功能与使用方法,包括如何查询表信息、
列
信息及数据类型。揭示了type与xtype字段之间的联系,以及在高版本SQL Server中使用这些系统表时的注意事项。
Sqlserver 系统表
sys
objects、
sys
column
s、
sys
types
函数object_id
本文详细介绍了SQL Server中的
sys
objects、
sys
column
s表及其重要字段解释,包括对象类型、字段类型、物理存储长度等内容,并提供了查看表名、字段名的方法,以及object_id函数的使用。同时,文章还附上了SQL获取所有数据库名、表名、储存过程以及参数
列
表的实例。
SQL Server中
sys
objects、
sys
olumns、
sys
types
本文介绍了SQL Server中三个重要的系统表:
sys
objects、
sys
column
s和
sys
types
。这些表可以帮助开发者获取数据库对象的信息,如表名、字段名及类型等。通过SQL查询,可以方便地读取这些元数据,用于自动生成增删改查代码。
SQL Server的系统表及其应用
本文介绍SQLServer系统表,特别是
SYS
OBJECTS、
SYS
COLUMN
S和
SYS
TYPES
表,并通过一个存储过程示例展示如何利用这些表获取数据库结构信息。
sql 查找表中定义的
列
宽
本文介绍了三种查询SQL字段长度的方法,包括使用
sys
column
s和
sys
types
表查询字段
名称
、数据类型及长度,利用INFORMATION_SCHEMA.
COLUMN
S获取字符最大长度等信息,以及通过
sys
column
s和
sys
types
表联合查询字段详情。
Sybase
2,598
社区成员
25,608
社区内容
发帖
与我相关
我的任务
Sybase
Sybase相关技术讨论区
复制链接
扫一扫
分享
社区描述
Sybase相关技术讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章