[英]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.