如何使用.Net从create sql语句中提取所有字段?

时间:2009-07-08 00:19:08

标签: .net sql vb.net regex

我正在使用VB.Net创建一个Windows应用程序,这个应用程序将SQl创建.sql文件作为参数,并将列表或数组中的所有字段及其数据类型返回。

示例:

USE [MyDB] GO /****** Object: Table [dbo].[User] Script Date: 07/07/2009 10:16:48 ******/ 

SET 
ANSI_NULLS ON GO 

SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[User]( [UserId] [int] IDENTITY(1,1) NOT NULL, 

[FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [MiddleName] 

[varchar](50) COLLATE SQL_Latin1_General_CP1_CI_A 

应该回归:

UserId int,FirstName字符串,MiddleName字符串

我想以任何方式,纯vb.net代码或使用RegEx。

任何人都知道完成此任务的最快方法吗?

3 个答案:

答案 0 :(得分:1)

一种选择是使用SMO创建内存数据库,执行脚本,然后遍历表列。

Here是一篇相反的文章,但你应该可以用它开始。

披露:我认为使用分裂和正则表达式可能是一个更好的解决方案,但我想你会得到很多这样的,所以我想我会抛出一个替代。毕竟,这就是这个网站的内容

答案 1 :(得分:1)

首先,您使用的是什么样的SQL?其次,CREATE TABLE的{​​{3}}可以相当“详细”。您是否正在处理可能使此问题更容易处理的一般语法的较小子集?

但是,不是试图解析语句,最快的方法可能是拥有一个垃圾数据库,您可以执行CREATE TABLE语句,然后通过

提取列名称和类型
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='MyCreatedTable'

(我在这里假设SQL Server。)

正是如此,

string createTableCommandText; // "CREATE TABLE MyCreatedTable..."
using(var connection = new SqlConnection(connectionString)) {
    connection.Open();
    var createCommand = connection.CreateCommand();
    createCommand.CommandText = createTableCommandText;
    createCommand.ExecuteNonQuery();

    var schemaCommand = connection.CreateCommand();
    schemaCommand.CommandText = "SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='MyCreatedTable'";
    var reader = schemaCommand.ExecuteReader();
    while(reader.Read()) {
        Console.WriteLine(String.Format("{0}|{1}", reader["COLUMN_NAME"], reader["DATA_TYPE"]));
    }

    var deleteCommand = connection.CreateCommand();
    deleteCommand.CommandText = "DROP TABLE MyCreatedTable";
    deleteCommand.ExecuteNonQuery();
}

抱歉它在C#中。我没有足够的流利使用VB来编写大致正确的代码而没有编译器在我的指尖。

答案 2 :(得分:0)

代码和正则表达式的混合。一个用于分割语句的正则表达式,用代码循环结果。对于每个语句,使用正则表达式来确定它是否是您关心的语句。如果是,请使用另一个正则表达式来提取所需信息。

有时你需要做一个多级正则表达式的方法来简化事情 - 抓住你关心的区域,然后使用另一个正则表达式从匹配中拉出碎片。