解析SQL文本

解析SQL文本,sql,vb.net,parsing,Sql,Vb.net,Parsing,有人知道如何用VB.NET解析SQL文本吗 例如:我得到了一个sql文件“createtable…”我想得到一个列数组和一个数据类型数组。将该语句提供给sql Server并在临时数据库中实际创建该表可能是最简单的方法 在那之后,了解表结构就很容易了 您只需从语句字符串中解析出表的名称。更好的是,您可以简单地替换它,并从一开始就拥有一个已知的表名 此外,如果该语句是有效的SQL,您将获得信息。将该语句提供给SQL Server并在临时数据库中实际创建该表可能是最简单的方法 在那之后,了解表结构就

有人知道如何用VB.NET解析SQL文本吗


例如:我得到了一个sql文件“createtable…”我想得到一个列数组和一个数据类型数组。

将该语句提供给sql Server并在临时数据库中实际创建该表可能是最简单的方法

在那之后,了解表结构就很容易了

您只需从语句字符串中解析出表的名称。更好的是,您可以简单地替换它,并从一开始就拥有一个已知的表名


此外,如果该语句是有效的SQL,您将获得信息。

将该语句提供给SQL Server并在临时数据库中实际创建该表可能是最简单的方法

在那之后,了解表结构就很容易了

您只需从语句字符串中解析出表的名称。更好的是,您可以简单地替换它,并从一开始就拥有一个已知的表名


此外,如果该语句是有效的SQL,您将获得信息。

在@Tomalak的帖子上展开:一旦构建了表,如果您只需要架构或实际数据,您可以使用DataReader选择一行,然后执行以下操作:

Dim myReader As DataReader
Dim myTable As DataTable

Dim myColumns As New Collection

myReader =  //' get your data

If myReader.HasRows Then
    myTable.Load(myReader)
    For Each col As DataColumn In myTable.Columns
        myColumns.Add(col.DataType.ToString, col.ColumnName)
    Next
End If
集合myColumns现在将具有列名称的
,并且
是列数据类型。如果需要,您可以修改此设置以创建两个单独的集合


另一方面,解析一个字符串将涉及更多的调试,并提供更多的出错空间。

在@Tomalak的帖子上展开:一旦构建了表,如果您只需要架构或实际数据,您可以使用DataReader选择一行,然后执行以下操作:

Dim myReader As DataReader
Dim myTable As DataTable

Dim myColumns As New Collection

myReader =  //' get your data

If myReader.HasRows Then
    myTable.Load(myReader)
    For Each col As DataColumn In myTable.Columns
        myColumns.Add(col.DataType.ToString, col.ColumnName)
    Next
End If
集合myColumns现在将具有列名称的
,并且
是列数据类型。如果需要,您可以修改此设置以创建两个单独的集合

另一方面,解析字符串将涉及更多的调试,并为错误提供更多的空间。

请检查

输入SQL:

create table new_employees
(
    employee_id  number primary key,
    first_name  varchar2(15) null,
    last_name varchar2(15) check(last_name>10),
    hire_date date default sysdate,
    dept_id number,
    dept_name varchar2(100),
    start_date timestamp(7) references scott.dept(start_date),
    end_date timestamp(7)   references dept.end_date on delete cascade,
    check (start_date>end_date),
    constraint c_name unique(first_name,last_name),
    foreign key(dept_id,dept_name) references dept(id,name)
); 
生成的输出:

Table Name:new_employees
Columns:
name:employee_id
datetype:number
inline constraints:
    primary key

name:first_name
datetype:varchar2(15)
null: yes

name:last_name
datetype:varchar2(15)
inline constraints:
    check:last_name>10

name:hire_date
datetype:date
default:sysdate

name:dept_id
datetype:number

name:dept_name
datetype:varchar2(100)

name:start_date
datetype:timestamp(7)
inline constraints:
    foreign key
    referenced table:scott.dept
    referenced columns:start_date

name:end_date
datetype:timestamp(7)
inline constraints:
    foreign key
    referenced table:dept.end_date

outline constraints:
    check:start_date>end_date

    constraint name:c_name
    unique key
    columns:first_name,last_name

    foreign key
    columns:dept_id,dept_name
    referenced table:dept
    referenced columns:id,name
请查收

输入SQL:

create table new_employees
(
    employee_id  number primary key,
    first_name  varchar2(15) null,
    last_name varchar2(15) check(last_name>10),
    hire_date date default sysdate,
    dept_id number,
    dept_name varchar2(100),
    start_date timestamp(7) references scott.dept(start_date),
    end_date timestamp(7)   references dept.end_date on delete cascade,
    check (start_date>end_date),
    constraint c_name unique(first_name,last_name),
    foreign key(dept_id,dept_name) references dept(id,name)
); 
生成的输出:

Table Name:new_employees
Columns:
name:employee_id
datetype:number
inline constraints:
    primary key

name:first_name
datetype:varchar2(15)
null: yes

name:last_name
datetype:varchar2(15)
inline constraints:
    check:last_name>10

name:hire_date
datetype:date
default:sysdate

name:dept_id
datetype:number

name:dept_name
datetype:varchar2(100)

name:start_date
datetype:timestamp(7)
inline constraints:
    foreign key
    referenced table:scott.dept
    referenced columns:start_date

name:end_date
datetype:timestamp(7)
inline constraints:
    foreign key
    referenced table:dept.end_date

outline constraints:
    check:start_date>end_date

    constraint name:c_name
    unique key
    columns:first_name,last_name

    foreign key
    columns:dept_id,dept_name
    referenced table:dept
    referenced columns:id,name

我所要做的就是解析出语句字符串,我已经知道了,我的意思是“如何”才能做到这一点,例如,什么?不,你误读了我。你所要做的就是找出并替换表名,这是一个简单的练习,有一个小的子字符串/索引函数例程(如果你知道的话,甚至还有一个正则表达式)。@Tomalak:+1耐心地回答这个评论!;-)您使用的是SQL Server吗?如果是的话。。。如果这是在生产中,而您没有临时数据库,您可以创建一个###临时表,然后执行@Tomalak建议的操作。我所要做的就是解析语句字符串,我已经知道,我的意思是“如何”执行,示例或其他什么?不,您误读了我的意思。你所要做的就是找出并替换表名,这是一个简单的练习,有一个小的子字符串/索引函数例程(如果你知道的话,甚至还有一个正则表达式)。@Tomalak:+1耐心地回答这个评论!;-)您使用的是SQL Server吗?如果是的话。。。如果这是在生产环境中,并且您没有临时数据库,那么您可以创建一个##临时表,然后按照@Tomalak的建议进行操作,以解决我的问题,谢谢,是否仍要检索列数据类型(及其最大值)?谢谢解决了我的问题谢谢无论如何都要检索列数据类型(及其最大值)?谢谢你为什么不发一个文件的样本,也许有人会告诉你你需要做什么。比如寻找关键词liek“CREATE TABLE”。为什么不发布一个文件的示例,也许有人会告诉你需要做什么。喜欢寻找关键词liek“创建表格”。