我正在使用2个数据库,两个数据库都包含相同的表格,但数据存在一些差异。
我想知道是否有办法在sql表中获取列的名称和数据类型,然后将每个和数据类型的名称添加到列表中以供以后分析。
答案 0 :(得分:3)
您有三个(如果您投入ADO.NET四个)选项来访问您的数据库:
SQLDataConnection
Type Provider,可与SQLServer一起使用。它适用于SQLServer,如果您更喜欢使用LINQ,这是一种访问它的简单方法。 SqlDataProvider
Type Provider,可与各种数据库配合使用。如果您的数据库不是SQLServer,那么这是要使用的类型提供程序。SqlClient
Type Provider可以让您访问类型安全的SQL。如果您使用的是SQLServer并且精通T-SQL,那么这就是您的选择。 您可以使用这三个来获取相关数据。这是通过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;