के लिए डेल्फी में एसक्यूएल पार्सर मैं SQL सर्वर के लिए डेल्फी (2010) में एक अच्छा SQL पार्सर ढूंढ रहा हूं। मुझे एक क्वेरी को पार्स करने और निकालने के लिए ऐसी चीज चाहिए: खंडों का चयन करें, कहां और ऑर्डर करें। इससे कोई फर्क नहीं पड़ता कि यह एक वाणिज्यिक या ओपन-सोर्स समाधान है। यह एक डीएलएल भी हो सकता है (निश्चित रूप से किसी भी भाषा में लिखा गया है) लेकिन मैं एक डीएलएल पर एक वीसीएल घटक पसंद करता हूं।SQL सर्वर
उत्तर
राफेल डेल्फी एक एसक्यूएल
चेक इन कार्यों
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
यह वास्तव में अच्छा है, लेकिन ऐसा लगता है कि 'TOP' एक फ़ील्ड है, लेकिन यह बिल्कुल नहीं है। –
यह ठीक से काम नहीं करता जैसा मैंने कहा था। यह कई मामलों पर विफल रहता है, जैसे कि जब आपके पास 'टेबल.फिल्ल्ड' है, तो यह फ़ील्ड के रूप में 'तालिका' और फ़ील्ड के रूप में 'फ़ील्ड' लौटाता है। यह 'गणना() ',' योग() ',' औसत' और 'शीर्ष' का पता लगाने में विफल रहता है। जो कुछ मैं ढूंढ रहा हूं उसके लिए पर्याप्त नहीं है, लेकिन आपकी मदद के लिए धन्यवाद। –
@ राफेल इसके लिए खेद है, मैं अपना जवाब रखूंगा, क्योंकि भविष्य में सरल एसक्यूएल वाक्यों को पार्स करने के लिए भविष्य में किसी और की मदद कर सकता हूं। एक अन्य विकल्प इस कार्यान्वयन (डीबीकॉमॉन) में आधारित अपने स्वयं के पार्सर का निर्माण कर रहा है और इस तरह के एक लेख को पढ़ रहा है http://www.felix-colibri.com/papers/db/sql_parser/sql_parser.html – RRUZ
जांच वापस आ जाएगी: http://www.sqlparser.com/sql-parser-vcl.php
यह एक बहुत शक्तिशाली एसक्यूएल पार्सर और सभी VCL में
- 1. SQL सर्वर
- 2. SQL सर्वर
- 3. SQL सर्वर
- 4. SQL सर्वर
- 5. SQL सर्वर
- 6. SQL सर्वर
- 7. SQL सर्वर
- 8. SQL सर्वर
- 9. SQL सर्वर
- 10. SQL सर्वर
- 11. SQL सर्वर
- 12. SQL सर्वर
- 13. SQL सर्वर
- 14. SQL सर्वर
- 15. SQL सर्वर
- 16. SQL सर्वर
- 17. SQL सर्वर
- 18. SQL सर्वर
- 19. SQL सर्वर
- 20. SQL सर्वर
- 21. SQL सर्वर
- 22. SQL सर्वर
- 23. SQL सर्वर
- 24. SQL सर्वर
- 25. SQL सर्वर
- 26. SQL सर्वर
- 27. SQL सर्वर
- 28. SQL सर्वर
- 29. SQL सर्वर
- 30. SQL सर्वर
नहीं ठीक उसी सवाल यह है कि लेकिन एक नज़र लायक हो सकता है : ttp: //stackoverflow.com/questions/615608/need-in-sql-parser-on-delphi –
हाँ, लेकिन यह फायरबर्ड के लिए है, एसक्यूएल सर्वर के लिए नहीं। और उनके बीच मतभेद हैं। –
सीटीई, नेस्टेड प्रश्नों के साथ, सम्मिलित/ड्रॉप/अपडेट/परिवर्तन/आदि कथन, यह गैर-मामूली कोड है। एसक्यूएल सर्वर क्वेरी को पार्स करने का वास्तव में एकमात्र सुरक्षित तरीका एसक्यूएल सर्वर के साथ है। –