如何确定任意一块T-SQL所需的参数?

Joh*_*zen 11 .net c# t-sql reflection

基本上,我正在寻找一个相当于SqlCommandBuilder.DeriveParameters任意T-SQL的工具.

例如,此查询需要一个参数:

SELECT @Foo [Foo], '@Bar' [Bar], @Baz [Baz]
Run Code Online (Sandbox Code Playgroud)

我基本上需要提取:

new[] { "Foo", "Baz" }
Run Code Online (Sandbox Code Playgroud)

从上面.我可以构建一个SQL解析器,但我有一个到SQL服务器的开放连接,所以我更愿意使用现有的选项.


编辑:

是一个办法做到这一点,因为SQL Server商业智能开发工作室是能够做到这一点非常成功.


编辑2:

SQL BIDS正在执行此命令以描述结果:

exec sp_executesql N'SET FMTONLY OFF;SET FMTONLY ON;SELECT @Foo [Foo], ''@Bar'' [Bar], @Baz [Baz]',
    N'@Foo sql_variant,@Baz sql_variant',
    @Foo=NULL,@Baz=NULL
Run Code Online (Sandbox Code Playgroud)

这解释了它如何确定列,但它可能只是字符串解析来获取参数...

Mar*_*ith 10

您可以使用Microsoft.Data.Schema.ScriptDom.我自己并不熟悉,但我只是尝试解析你的语句,并且可以看到变量可以在ScriptTokenStream集合中访问(不确定是否有更简单的方法来获取它们)

编辑:从评论中发布OP自己的代码!

    var sql = "SELECT @Foo [Foo], '@Bar' [Bar], @Baz [Baz]";
    var p = new TSql100Parser(true);
    var errors = new List<ParseError>();
    var tokens = p.GetTokenStream(new StringReader(sql), errors);
    if (errors.Count == 0)
    {
        var variables = (from t in tokens where t.TokenType == 
                       TSqlTokenType.Variable select t.Text).ToArray();
    }
Run Code Online (Sandbox Code Playgroud)

SQL Server 2012还引入sp_describe_undeclared_parameters了相关但与本示例失败的内容,因为它需要能够推导出数据类型.