F#获取数据库列名和数据类型

时间:2016-09-26 15:25:33

标签: sql f# database-metadata

我正在使用2个数据库,两个数据库都包含相同的表格,但数据存在一些差异。

我想知道是否有办法在sql表中获取列的名称和数据类型,然后将每个和数据类型的名称添加到列表中以供以后分析。

2 个答案:

答案 0 :(得分:3)

您有三个(如果您投入ADO.NET四个)选项来访问您的数据库:

  1. F#3附带的库存SQLDataConnection Type Provider,可与SQLServer一起使用。它适用于SQLServer,如果您更喜欢使用LINQ,这是一种访问它的简单方法。
  2. 更新,更通用的SqlDataProvider Type Provider,可与各种数据库配合使用。如果您的数据库不是SQLServer,那么这是要使用的类型提供程序。
  3. SqlClient Type Provider可以让您访问类型安全的SQL。如果您使用的是SQLServer并且精通T-SQL,那么这就是您的选择。
  4. 您可以使用这三个来获取相关数据。这是通过SqlCommandProvider使用SQL查询的一种方法(方法3):

    #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 :(选项*选项)list = [(有些   “AutoUpdated”,一些“bigint”); (一些“UpdatedDate”,一些“datetime”);   (一些“DataDate”,一些“datetime”); (一些“RandomStuff”,一些   “浮动”); ...]

    如果您想摆脱选项类型,可以使用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 
    

答案 1 :(得分:1)

SQL Server

exec sp_help&#39; tablename&#39;