簡體   English   中英

如何確定任意一塊T-SQL所需的參數?

[英]How can I determine the parameters required by an arbitrary piece of T-SQL?

基本上,我正在尋找一個適用於任意T-SQL的SqlCommandBuilder.DeriveParameters

例如,此查詢需要一個參數:

SELECT @Foo [Foo], '@Bar' [Bar], @Baz [Baz]

我基本上需要提取:

new[] { "Foo", "Baz" }

從上面。 我可以構建一個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 

這解釋了它如何確定列,但它可能只是字符串解析來獲取參數...

您可以使用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();
    }

SQL Server 2012還引入了sp_describe_undeclared_parameters ,它與相關但是失敗,因為它需要能夠推導出數據類型。

使用RegEx並解析參數,我快速測試了這個,所以不確定是否可行,可能需要修改。

[^'] @([^ [,] +)

如果您需要修改正則表達式字符串,我發現這個站點非常有用: http//regexlib.com/RETester.aspx

public Form1()
    {
        InitializeComponent();

        string query = "SELECT @Foo [Foo], '@Bar' [Bar], @Baz [Baz] ";
        Regex r = new Regex(@"[^']@([^\[,]+)");
        MatchCollection collection = r.Matches(query);
        string[] array = new string[collection.Count];

        for (int i = 0; i < collection.Count; i++)
        {
            array[i] = collection[i].Value.Trim();

            // If you want the string[] populated without the "@"
            // array[i] = collection[i].Groups[1].Value.Trim();
        }
    }

我認為SqlCommandBuilder.DeriveParameters工作原理是詢問SQL Server參數是什么,在這種情況下不是一個選項。 像RegEx這樣的字符串處理可能是你最好的選擇。

這個正則表達式也許能夠做到這一點

@([_a-zA-Z]+) 

沒有自己嘗試過,但它來自這個類似的問題

它還會在注釋和引用的字符串中找到參數,但它是一個開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM