2011-04-26 22 views
11

Về cơ bản, tôi đang tìm kiếm một tương đương với SqlCommandBuilder.DeriveParameters sẽ hoạt động cho T-SQL tùy ý.Làm cách nào để xác định các tham số được yêu cầu bởi một phần T-SQL tùy ý?

Ví dụ, truy vấn này đòi hỏi một tham số:

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

tôi về cơ bản cần phải giải nén:

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

Từ trên. Tôi có thể xây dựng một trình phân tích cú pháp SQL, nhưng tôi có một kết nối mở với máy chủ SQL, vì vậy tôi muốn sử dụng một tùy chọn hiện có nếu có thể.


Edit:

là một cách để làm điều này, bởi vì Business Intelligence Development Studio SQL Server có thể làm được điều này rất thành công.


Chỉnh sửa 2:

BIDS SQL được thực thi lệnh này để mô tả kết quả:

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 

nào giải thích làm thế nào nó có thể xác định các cột, nhưng nó thể được chỉ cần phân tích cú pháp chuỗi để nhận các tham số ...

+0

Bạn đang xây dựng chuỗi ban đầu này như thế nào? Có cái gì bạn có thể sử dụng mà bạn đang sử dụng để tự động xây dựng chuỗi này để tìm các thông số cần thiết? – mservidio

+0

SQL Profiler có hiển thị bất kỳ điều gì thú vị nếu bạn xem máy chủ trong khi nhận được Business Intelligence Development Studio để làm điều này không? Sẽ cho chúng tôi biết nếu đó là một chức năng máy chủ hoặc chỉ phân tích cú pháp chuỗi – AakashM

+0

Có lẽ chỉ cần sử dụng một biểu thức chính quy để tìm các biến @ mà không được đặt trong dấu ngoặc kép ... mà nên làm việc tôi nghĩ. – mservidio

Trả lời

10

Bạn có thể sử dụng Microsoft.Data.Schema.ScriptDom cho việc này. Tôi không quen thuộc với nó bản thân mình nhưng tôi chỉ cố gắng phân tích cú pháp tuyên bố của bạn và có thể thấy rằng các biến có thể truy cập trong bộ sưu tập ScriptTokenStream (không chắc chắn nếu có một cách dễ dàng hơn để giữ chúng hay không)

Edit: Đăng mã riêng của OP từ các bình luận!

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 cũng giới thiệu sp_describe_undeclared_parameters có liên quan nhưng không thành công với ví dụ này vì nó cần để có thể suy ra các kiểu dữ liệu.

+0

Làm cách nào tôi có thể sử dụng điều này để nhận các bảng trong truy vấn SQL. Tôi đã thử thay thế Biến bằng Bảng trong mã của bạn. Nó không hoạt động. Khi tôi sử dụng Mã định danh, nó cung cấp cả tên cột và tên bảng. Có cách nào để chỉ lấy tên bảng không? –

+0

@DeepanCool Gert Draper của câu trả lời ở đây có vẻ như nó sẽ làm điều đó https://social.msdn.microsoft.com/Forums/sqlserver/en-US/24fd8fa5-b1af-44e0-89a2-a278bbf11ae0/parsing?forum=ssdt –

1

Sử dụng RegEx và phân tích các tham số, tôi đã nhanh chóng kiểm tra điều này , do đó, không chắc chắn nếu sẽ làm việc, có thể cần modiciation.

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

Nếu bạn cần phải sửa đổi các chuỗi biểu thức chính quy, tôi tìm thấy trang web này rất hữu ích: 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(); 
     } 
    } 
0

Tôi nghĩ SqlCommandBuilder.DeriveParameters công trình bằng cách hỏi SQL Server những tham số nào, đó không phải là một tùy chọn trong trường hợp này. Một số loại xử lý chuỗi như RegEx có lẽ là đặt cược tốt nhất của bạn.

Regex này có thể có thể làm điều đó

@([_a-zA-Z]+) 

đã không thử nó bản thân mình, nhưng từ này similar question

Nó cũng sẽ tìm thấy các thông số trong ý kiến ​​và trích dẫn chuỗi nhưng một sự khởi đầu của nó.

Các vấn đề liên quan