2011-06-09 14 views
10

के लिए डेल्फी में एसक्यूएल पार्सर मैं SQL सर्वर के लिए डेल्फी (2010) में एक अच्छा SQL पार्सर ढूंढ रहा हूं। मुझे एक क्वेरी को पार्स करने और निकालने के लिए ऐसी चीज चाहिए: खंडों का चयन करें, कहां और ऑर्डर करें। इससे कोई फर्क नहीं पड़ता कि यह एक वाणिज्यिक या ओपन-सोर्स समाधान है। यह एक डीएलएल भी हो सकता है (निश्चित रूप से किसी भी भाषा में लिखा गया है) लेकिन मैं एक डीएलएल पर एक वीसीएल घटक पसंद करता हूं।SQL सर्वर

+0

नहीं ठीक उसी सवाल यह है कि लेकिन एक नज़र लायक हो सकता है : ttp: //stackoverflow.com/questions/615608/need-in-sql-parser-on-delphi –

+0

हाँ, लेकिन यह फायरबर्ड के लिए है, एसक्यूएल सर्वर के लिए नहीं। और उनके बीच मतभेद हैं। –

+1

सीटीई, नेस्टेड प्रश्नों के साथ, सम्मिलित/ड्रॉप/अपडेट/परिवर्तन/आदि कथन, यह गैर-मामूली कोड है। एसक्यूएल सर्वर क्वेरी को पार्स करने का वास्तव में एकमात्र सुरक्षित तरीका एसक्यूएल सर्वर के साथ है। –

उत्तर

10

राफेल डेल्फी एक एसक्यूएल

चेक इन कार्यों

function NextSQLToken(var p: PAnsiChar; out Token: AnsiString; CurSection: TSQLToken): TSQLToken; overload; 
function NextSQLToken(var p: PWideChar; out Token: WideString; CurSection: TSQLToken): TSQLToken; overload; 
function NextSQLToken(var p: PChar; out Token: String; CurSection: TSQLToken): TSQLToken; overload; 

function GetIndexForOrderBy(const SQL: WideString; DataSet: TDataSet): TIndexDef; 
function GetTableNameFromSQL(const SQL: WideString): WideString; 
function GetTableNameFromQuery(const SQL: Widestring): Widestring; 
function AddParamSQLForDetail(Params: TParams; SQL: WideString; Native: Boolean; QuoteChar: WideString = ''): WideString; 
function IsMultiTableQuery(const SQL: WideString): Boolean; 
function SQLRequiresParams(const SQL: WideString): Boolean; 

function NextSQLTokenEx(var p: PWideChar; out Token: UnicodeString; CurSection: TSQLToken; IdOption: IDENTIFIEROption): TSQLToken; overload; 
function NextSQLTokenEx(var p: PWideChar; out Token: WideString; CurSection: TSQLToken; IdOption: IDENTIFIEROption): TSQLToken; overload; 
function NextSQLTokenEx(var p: PAnsiChar; out Token: AnsiString; CurSection: TSQLToken; IdOption: IDENTIFIEROption): TSQLToken; overload; 
function GetTableNameFromSQLEx(const SQL: WideString; IdOption: IDENTIFIEROption): WideString; 

यह कैसे एक एसक्यूएल वाक्य पार्स और सभी तत्वों को मिल को दिखाने के लिए एक बहुत ही सरल नमूना है DBCommon इकाई में स्थित पार्सर के साथ आता है।

uses 
    TypInfo, 
    DbCommon, 
    SysUtils; 


const 
    StrSql ='Select Field1, Field2, 54 field3, Field4 from Mytable1 Order by Field1,Field5'; 

procedure ParseSql(Const Sql : string); 
var 
    SQLToken  : TSQLToken; 
    CurSection : TSQLToken; 
    Start  : PWideChar; 
    Token  : WideString; 
    IdOption  : IDENTIFIEROption; 
begin 
    IdOption :=idMixCase; 
    Start  :=PWideChar(StrSql); 
    CurSection := stUnknown; 
    repeat 
    SQLToken := NextSQLTokenEx(Start, Token, CurSection, IdOption); 
    if SQLToken<>stEnd then 
    Writeln(Format('Type %s Token %s', [GetEnumName(TypeInfo(TSQLToken), integer(SQLToken)),Token])); 
    CurSection := SQLToken; 
    until SQLToken in [stEnd]; 
end; 



begin 
    try 
    ParseSql(StrSql); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

इस

Type stSelect Token Select 
Type stFieldName Token Field1 
Type stFieldName Token Field2 
Type stNumber Token 54 
Type stFieldName Token field3 
Type stFieldName Token Field4 
Type stFrom Token from 
Type stTableName Token Mytable1 
Type stOrderBy Token Order by 
Type stFieldName Token Field1 
Type stFieldName Token Field5 
+0

यह वास्तव में अच्छा है, लेकिन ऐसा लगता है कि 'TOP' एक फ़ील्ड है, लेकिन यह बिल्कुल नहीं है। –

+0

यह ठीक से काम नहीं करता जैसा मैंने कहा था। यह कई मामलों पर विफल रहता है, जैसे कि जब आपके पास 'टेबल.फिल्ल्ड' है, तो यह फ़ील्ड के रूप में 'तालिका' और फ़ील्ड के रूप में 'फ़ील्ड' लौटाता है। यह 'गणना() ',' योग() ',' औसत' और 'शीर्ष' का पता लगाने में विफल रहता है। जो कुछ मैं ढूंढ रहा हूं उसके लिए पर्याप्त नहीं है, लेकिन आपकी मदद के लिए धन्यवाद। –

+1

@ राफेल इसके लिए खेद है, मैं अपना जवाब रखूंगा, क्योंकि भविष्य में सरल एसक्यूएल वाक्यों को पार्स करने के लिए भविष्य में किसी और की मदद कर सकता हूं। एक अन्य विकल्प इस कार्यान्वयन (डीबीकॉमॉन) में आधारित अपने स्वयं के पार्सर का निर्माण कर रहा है और इस तरह के एक लेख को पढ़ रहा है http://www.felix-colibri.com/papers/db/sql_parser/sql_parser.html – RRUZ