sqlserver 如何获得所有数据库名 如何获得已知数据库所有表名 和 已知表明获得所有字段名和字段类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 如何获得所有数据库名 如何获得已知数据库所有表名 和 已知表明获得所有字段名和字段类型相关的知识,希望对你有一定的参考价值。

我用的是SqlServer2000 和 SqlServer 2005

1、获得所有数据库名

   选择master数据库,查询表sysdatabases;

2、获得所有数据表名

   选择你要查询的数据库,查询表sysobjects,并且xtype为'U';

3、获得所有字段名和字段类型

   选择你要查询的数据库,查询表syscolumns,语句如下:

   select

 b.name, a.name, c.name

    from syscolumns a

 inner join sysobjects b on a.id = b.id

 inner join systypes c on a.xtype = c.xtype

参考技术A select name from sys.tables
查看表名字

SELECT
name
FROM
sys.columns
WHERE
object_id =
(SELECT object_id FROM sys.tables WHERE name = 'SALE_REPORT')
知道表名字的情况下,查询列名

如何获得JVM执行过程中调用的方法名

这应该分成两个问题,1.如何获取参数值. 2.如何获取参数名, 

1.如何获取参数值。这个是运行时的数据,你程序处理下获取就好了。比如写一个代理

2.参数名是在编译的时候就写入到class文件的。,而这些方法的参数在class中就是一个局部变量。class对于局部变量的定义和存储专门有张表。
单纯通过反射目前好像没有办法,通过字节码解析倒是可以
比如下面代码

public static void staticMethod(String args1, String args2) {
}

局部变量表:
[pc: 0, pc: 1] local: args1 index: 0 type: java.lang.String
[pc: 0, pc: 1] local: args2 index: 1 type: java.lang.String

pc 0是每个字节码指令的程序计数器。[pc: 0, pc: 1] local: args1 index: 0 type: java.lang.String就是说在程序第0个指令到第1个指令的局部变量数组下标为0的变量类型是String变量名是args1.

public static void nonStaticMethod(String args1, String args2) {
}

局部变量表;
[pc: 0, pc: 1] local: this index: 0 type: asmtest.Test
[pc: 0, pc: 1] local: args1 index: 1 type: java.lang.String
[pc: 0, pc: 1] local: args2 index: 2 type: java.lang.String

这个方法比上面的方法多了一个this。因为这个方法是非静态方法。

所以如果要获取参数名需要解析字节码。这里给你一段代码使用ASM

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;

public class ReadMethodArgNameClassVisitor extends ClassVisitor {

public Map<String, List<String>> nameArgMap = new HashMap<String, List<String>>();

public ReadMethodArgNameClassVisitor() {
super(Opcodes.ASM5);
}

@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
Type methodType = Type.getMethodType(desc);
int len = methodType.getArgumentTypes().length;
List<String> argumentNames = new ArrayList<String>();
nameArgMap.put(name, argumentNames);
ReadMethodArgNameMethodVisitor visitor = new ReadMethodArgNameMethodVisitor(Opcodes.ASM5);
visitor.argumentNames = argumentNames;
visitor.argLen = len;
return visitor;
}
}

import java.util.List;

import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;

public class ReadMethodArgNameMethodVisitor extends MethodVisitor {

public List<String> argumentNames;

public int argLen;

public ReadMethodArgNameMethodVisitor(int api) {
super(api);
}

@Override
public void visitLocalVariable(String name, String desc, String signature,
Label start, Label end, int index) {
if("this".equals(name)) {
return;
}
if(argLen-- > 0) {
argumentNames.add(name);
}
}

}

public class POJO {

public void say(String message, int times){
}

}

import java.io.IOException;
import java.util.List;
import java.util.Map.Entry;

import org.objectweb.asm.ClassReader;

public class Test {

public static void main(String... args1) throws IOException {
ClassReader cr = new ClassReader("POJO");
ReadMethodArgNameClassVisitor classVisitor = new ReadMethodArgNameClassVisitor();
cr.accept(classVisitor, 0);
for(Entry<String, List<String>> entry : classVisitor.nameArgMap.entrySet()) {
System.out.println(entry.getKey());
for(String s : entry.getValue()) {
System.out.println(" " + s);
}
}
}

}

使用asm版本是

<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-all</artifactId>
<version>5.0.3</version>
</dependency>

这里存在一个隐患,如果有些class文件做了加密混淆吧局部变量表里面的变量名改变了,那就没法获得源码级别的参数名了。

以上是关于sqlserver 如何获得所有数据库名 如何获得已知数据库所有表名 和 已知表明获得所有字段名和字段类型的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer 获得所有表结构(包括表名及字段)

sql中如何提取从数据库中所获得时间的年份

Delphi如何获得窗口的名字?

如何查询每个学生已获得的学分(注:成绩及格才能获得相应课程的学分)

如何获得分组列的前 10 名?

java如何获得数据库表中各字段的字段名