簡體   English   中英

如何使用.Net從創建SQL語句中提取所有字段?

[英]How to extract all fields from create sql statment using .Net?

我正在使用VB.Net創建Windows應用程序,此應用程序將使用SQl create .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。

有人知道最快的方法嗎?

一種選擇是使用SMO創建內存數據庫,執行腳本,然后遍歷表列。

是一篇相反的文章,但您應該可以從中開始。

披露:我認為使用splits和regex可能是一個更好的解決方案,但我認為您會得到很多,所以我想我會選擇其他方法。 畢竟,這就是這個網站的目的

首先,您使用哪種SQL? 其次, CREATE TABLE語法可以相當“詳細”。 您是否正在處理較小的一般語法子集,而這可能會使解決此問題變得更簡單?

但是,與其嘗試解析該語句,不如嘗試最快的方法是使用可以在其上執行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來編寫幾乎正確的代碼,而無需借助編譯器。

代碼和正則表達式的混合。 一個正則表達式可拆分語句,並通過代碼循環遍歷結果。 對於每個語句,請使用正則表達式確定它是否是您關心的那種語句。 如果是這樣,請使用另一個正則表達式提取所需的信息。

有時,您需要執行多級正則表達式方法來簡化操作-抓住您關心的區域,然后使用另一個正則表達式將部分內容從比賽中刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM