F# 获取数据库列名和数据类型
F# Get Database column names and data types
我正在使用 2 个数据库,它们都包含相同的 table,但数据存在一些差异。
我想知道是否有办法获取 sql table 中列的名称和数据类型,然后将每个列的名称和数据类型添加到列表中供以后使用分析。
SQL 服务器
执行 sp_help 'tablename'
您有三个(如果您输入 ADO.NET,则有四个)选项来访问您的数据库:
- 库存
SQLDataConnection
Type Provider 随 F# 3 一起提供,可与 SQLServer 一起使用。它适用于 SQLServer,如果您更喜欢使用 LINQ,这是一种访问它的简便方法。
- 一个更新的、多功能的
SqlDataProvider
Type Provider,适用于各种数据库。如果您的数据库不是 SQLServer,则这是要使用的类型提供程序。
- 还有
SqlClient
Type Provider 可以让您访问类型安全 SQL。如果您在 SQLServer 上并且精通 T-SQL,这就是您要走的路。
您可以同时使用这三个来获取相关数据。这是通过 SqlCommandProvider
(方法 3)使用 SQL 查询的一种方法:
#r @"..\packages\FSharp.Data.SqlClient.1.8.2\lib\net40\FSharp.Data.SqlClient.dll"
open FSharp.Data
open System
[<Literal>]
let connectionString = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=C:\Users\username\Documents\test.mdf;Integrated Security=True;Connect Timeout=10"
let cmd = new SqlCommandProvider<"select * from Information_schema.Columns where table_name = @tableName",connectionString>(connectionString)
let out = cmd.Execute(tableName="yourTableName")
out
|> Seq.map (fun x -> (x.COLUMN_NAME,x.DATA_TYPE))
|> Seq.toList
val it : (Option * Option) list = [(Some
"AutoUpdated", Some "bigint"); (Some "UpdatedDate", Some "datetime");
(Some "DataDate", Some "datetime"); (Some "RandomStuff", Some
"float"); ...]
如果您想摆脱选项类型,可以使用 x.COLUMN_NAME.Value
。
获取数据库中的所有表(这与服务器上的所有表不同)。您只需要将 DB_NAME 替换为您的数据库名称(或者如果它是 localdb,您可以跳过):
let cmd2 = new SqlCommandProvider<"select TABLE_NAME from [DB_NAME].Information_Schema.Tables where table_type = 'BASE TABLE'",connectionString>(connectionString)
let out2 = cmd2.Execute()
out2 |> Seq.toList
我正在使用 2 个数据库,它们都包含相同的 table,但数据存在一些差异。
我想知道是否有办法获取 sql table 中列的名称和数据类型,然后将每个列的名称和数据类型添加到列表中供以后使用分析。
SQL 服务器
执行 sp_help 'tablename'
您有三个(如果您输入 ADO.NET,则有四个)选项来访问您的数据库:
- 库存
SQLDataConnection
Type Provider 随 F# 3 一起提供,可与 SQLServer 一起使用。它适用于 SQLServer,如果您更喜欢使用 LINQ,这是一种访问它的简便方法。 - 一个更新的、多功能的
SqlDataProvider
Type Provider,适用于各种数据库。如果您的数据库不是 SQLServer,则这是要使用的类型提供程序。 - 还有
SqlClient
Type Provider 可以让您访问类型安全 SQL。如果您在 SQLServer 上并且精通 T-SQL,这就是您要走的路。
您可以同时使用这三个来获取相关数据。这是通过 SqlCommandProvider
(方法 3)使用 SQL 查询的一种方法:
#r @"..\packages\FSharp.Data.SqlClient.1.8.2\lib\net40\FSharp.Data.SqlClient.dll"
open FSharp.Data
open System
[<Literal>]
let connectionString = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=C:\Users\username\Documents\test.mdf;Integrated Security=True;Connect Timeout=10"
let cmd = new SqlCommandProvider<"select * from Information_schema.Columns where table_name = @tableName",connectionString>(connectionString)
let out = cmd.Execute(tableName="yourTableName")
out
|> Seq.map (fun x -> (x.COLUMN_NAME,x.DATA_TYPE))
|> Seq.toList
val it : (Option * Option) list = [(Some "AutoUpdated", Some "bigint"); (Some "UpdatedDate", Some "datetime"); (Some "DataDate", Some "datetime"); (Some "RandomStuff", Some "float"); ...]
如果您想摆脱选项类型,可以使用 x.COLUMN_NAME.Value
。
获取数据库中的所有表(这与服务器上的所有表不同)。您只需要将 DB_NAME 替换为您的数据库名称(或者如果它是 localdb,您可以跳过):
let cmd2 = new SqlCommandProvider<"select TABLE_NAME from [DB_NAME].Information_Schema.Tables where table_type = 'BASE TABLE'",connectionString>(connectionString)
let out2 = cmd2.Execute()
out2 |> Seq.toList