获取T-SQL输入&使用dacpac输出?

时间:2015-02-28 05:40:51

标签: sql-server sql-server-data-tools type-providers dacpac data-tier-applications

FSharp.Data.SqlClient依赖于sys.sp_describe_first_result_set来发现查询结果集的模式。问题是这需要在设计/构建时连接到SQL Server数据库。是否可以从.dacpac获取此信息? Data-tier Applications声称“启用声明性数据库开发”。

FSharp.Data.SqlClient

有读取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

从声明性模型中获取可能/可靠的输入和输出列表?是否有记录功能请求的好地方? : - )

1 个答案:

答案 0 :(得分:4)

对于简单查询(从表等中选择*),它很简单,使用scriptdom获取列名和表 - 我在旧博客文章中有一个示例来获取列类型和枚举表:

https://sqlserverfunctions.wordpress.com/2014/09/27/querying-the-dacfx-api-getting-column-type-information/

这将向您展示使用scriptdom的一个示例,一旦您了解必须使用访问者模式来获取所需的位,它就非常简单:

http://blogs.msdn.com/b/arvindsh/archive/2013/04/04/using-the-transactsql-scriptdom-parser-to-get-statement-counts.aspx

问题是人们可以编写奇怪的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的返回类型,然后知道在日期中添加一个字符串会给你一个日期 - 当你有一个结果集时会很容易,有点难当你有代码时。

如果这是你想要做的事情,请不要因为有一些挑战而被推迟!