【问题标题】:How to extract all fields from create sql statment using .Net?如何使用.Net从create sql语句中提取所有字段?
【发布时间】:2009-07-08 00:19:07
【问题描述】:

我正在使用 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。

有谁知道完成这个的最快方法?

【问题讨论】:

    标签: .net sql vb.net regex


    【解决方案1】:

    首先,您使用的是什么风格的 SQL?其次,CREATE TABLEsyntax 可以相当“详细”。您是否正在处理可能使解决此问题更简单的一般语法的较小子集?

    但与其尝试解析语句,最快的方法可能是拥有一个垃圾数据库,您可以在其上执行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】:

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

      Here 是一篇相反的文章,但你应该能够从它开始。

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

      【讨论】:

        【解决方案3】:

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

        有时您需要使用多级正则表达式方法来简化事情 - 抓住您关心的区域,然后使用另一个正则表达式从匹配中提取部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-02
          • 2023-01-26
          • 2019-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多