FSharp.Data.SqlClient依赖于sys.sp_describe_first_result_set
来发现查询结果集的模式。问题是这需要在设计/构建时连接到SQL Server数据库。是否可以从.dacpac
获取此信息? Data-tier Applications声称“启用声明性数据库开发”。
有读取dacpac及其内容和T-SQL AST的库。我认为输入和输出类型可以从该信息中获得。
// C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120\Microsoft.SqlServer.Dac.dll
// C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120\Microsoft.SqlServer.Dac.Extensions.dll
// C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.TransactSql.ScriptDom.dll
open Microsoft.SqlServer.Dac
open Microsoft.SqlServer.Dac.Model
open Microsoft.SqlServer.TransactSql.ScriptDom
从声明性模型中获取可能/可靠的输入和输出列表?是否有记录功能请求的好地方? : - )
答案 0 :(得分:4)
对于简单查询(从表等中选择*),它很简单,使用scriptdom获取列名和表 - 我在旧博客文章中有一个示例来获取列类型和枚举表:
这将向您展示使用scriptdom的一个示例,一旦您了解必须使用访问者模式来获取所需的位,它就非常简单:
问题是人们可以编写奇怪的t-sql,sql server很乐意使用它,即使api可用,也很难解决代码的实际意图。
因此,在所有情况下确定要做的事情很难(不是不可能但很难),例如:
create procedure getdata
as
if exists(select * from schema.table where id = 999)
begin
select 100 as id, 101 as number;
return
end
select 'abc' as name, * from schema.another_table
你得到了什么 - 你得到2个int值或字符串以及表中的所有值?我想这已经是现有sql客户端的一个问题了。
在sql:
中发生隐式转换会使其变得更难select 100, getdate() + '2014-01-01'
ast会说你有一个函数和一个字符串 - 你需要得到getdate的返回类型,然后知道在日期中添加一个字符串会给你一个日期 - 当你有一个结果集时会很容易,有点难当你有代码时。
如果这是你想要做的事情,请不要因为有一些挑战而被推迟!