2011-04-26 4 views
11

기본적으로 임의의 T-SQL에서 작동하는 SqlCommandBuilder.DeriveParameters에 해당하는 항목을 찾고 있습니다.임의의 T-SQL에 필요한 매개 변수를 어떻게 결정합니까?

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

나는 기본적으로 추출해야합니다 : 위부터

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

예를 들어,이 쿼리는 하나 개의 매개 변수가 필요합니다. SQL 파서를 만들 수는 있지만 SQL 서버에 대한 연결이 열려 있으므로 가능하면 기존 옵션을 사용하는 것을 선호합니다.


편집 : SQL 서버의 비즈니스 인텔리전스 개발 Studio를 매우 성공적으로이 작업을 수행 할 수 있기 때문에

을 가지고,이 할 수있는 방법이 될 수 있습니다.


편집 2 :

SQL 입찰 결과를 설명하기 위해이 명령을 실행 :이 열을 결정할 수 있지만,이수 있습니다 방법을 설명

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 

매개 변수를 얻기 위해 문자열 파싱 만하면됩니다 ...

+0

어떻게이 초기 문자열을 구축하고 있습니까? 필수 매개 변수를 찾기 위해이 문자열을 동적으로 구축하는 데 사용할 수있는 무언가가 있습니까? – mservidio

+0

Business Intelligence Development Studio에서 서버를 볼 때 SQL 프로파일 러에 흥미로운 점이 있습니까? 서버 함수인지 문자열 파싱인지 알 수 있습니다. – AakashM

+0

아마도 정규 표현식을 사용하여 따옴표로 묶이지 않은 @variables를 찾을 수 있습니다. – mservidio

답변

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(); 
    } 

SQL 서버 2012도 관련이 있지만이 데이터 유형을 추론 할 수 있어야이 예제와 함께 실패 sp_describe_undeclared_parameters을 소개합니다.

+0

이 방법을 사용하여 SQL 쿼리에서 테이블을 가져올 수 있습니다. 나는 당신의 코드에서 Variable을 Table로 대체하려고 시도했다. 작동하지 않습니다. 식별자를 사용하면 열 이름과 테이블 이름을 모두 제공합니다. 테이블 이름 만 가져 오는 방법이 있습니까? –

+0

@DeepanCool Gert Draper의 대답은 다음과 같습니다. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/24fd8fa5-b1af-44e0-89a2-a278bbf11ae0/parsing?forum=ssdt –

1

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(); 
     } 
    } 
0

나는 SqlCommandBuilder.DeriveParameters 일을 생각한다 이 경우 매개 변수가 무엇인지 SQL Server에 요청하여 옵션이 아닙니다. RegEx와 같은 문자열 처리는 아마 최선의 방법 일 것입니다.

이 정규식은

@([_a-zA-Z]+) 

는 그것을 자신을 시도하지 않은 할 수있을 수도 있지만,이 similar question

에서 또한 주석의 매개 변수를 찾을 문자열 그러나 그것의 시작을 인용한다 그것.

관련 문제