Разбор текста SQL - PullRequest
1 голос
/ 10 июня 2009

Кто-нибудь знает, как анализировать текст SQL с VB.NET?

Пример: я получил файл sql "CREATE TABLE ...", я хочу получить массив столбцов и массив типов данных.

Ответы [ 3 ]

4 голосов
/ 10 июня 2009

Это может быть самый простой способ передать этот оператор SQL Server и фактически создать эту таблицу во временной базе данных.

После этого выяснить структуру таблицы будет легко.

Все, что вам нужно было бы проанализировать из строки оператора, это имя таблицы. Более того, вы можете просто заменить его и иметь известное имя таблицы с самого начала.

Кроме того, вы получите информацию, если оператор даже является допустимым SQL.

3 голосов
/ 10 июня 2009

Расширение на пост @ Tomalak: как только вы построите таблицу, вы можете использовать DataReader, чтобы выбрать только 1 строку, если вам нужна только схема или ваши фактические данные, а затем сделать что-то вроде этого:

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 теперь будет иметь Key имени столбца, а Value - тип данных столбцов. Вы можете изменить это, чтобы сделать 2 отдельные коллекции, если вам нужно.

С другой стороны, синтаксический анализ строки потребует значительно больше отладки и предоставит много места для ошибок.

0 голосов
/ 11 июня 2012

Пожалуйста, отметьте это демо, чтобы помочь вам Анализ DDL заявления

Входной 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...