Estoy buscando un buen analizador de SQL en Delphi (2010) para SQL Server. Necesito tal cosa para analizar una consulta y extraer: seleccionar lista, donde y ordenar por cláusulas. No importa si se trata de una solución comercial o de código abierto. También puede ser un archivo DLL (escrito en cualquier idioma, por supuesto) pero prefiero un componente VCL sobre un archivo DLL.Analizador de SQL en Delphi para SQL Server
Respuesta
Rafael Delphi viene con un intérprete de SQL se encuentra en la unidad de DBCommon
comprobar estas funciones
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;
Ésta es una muestra muy simple para mostrar cómo analizar una sentencia SQL y obtener todos los elementos.
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.
Esto devolverá
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
Es realmente bueno, pero cree que 'TOP' es un campo, pero no es por supuesto. –
No funciona bien como dije. Falla en muchos casos, como cuando tienes 'Table.Field' devuelve' Table' como un campo y 'Field' como Field también. Falla al detectar 'Count()', 'Sum()', 'Average' y' top' también. No es lo suficientemente bueno para lo que estoy buscando, pero gracias por tu ayuda. –
@Rafael lo siento por eso, voy a mantener mi respuesta, porque puedo ayudarlo a alguien más en el futuro a analizar oraciones SQL simples. Otra opción es crear tu propio analizador basado en esta implementación (DbCommon) y leer un artículo como este http://www.felix-colibri.com/papers/db/sql_parser/sql_parser.html – RRUZ
la salida: http://www.sqlparser.com/sql-parser-vcl.php
Este es un muy potente analizador de SQL y todo en VCL
- 1. Analizador de SQL Server - Vista Dynamic Sql
- 2. ¿Hay un SQL Server Profiler para SQL Server Express?
- 3. SQL en SQL Server
- 4. Cómo obtengo los valores de los parámetros para la consulta de SQL Server en el Analizador de SQL Server
- 5. Explorador/Analizador de registro de transacciones de SQL Server
- 6. Analizador de SQL en PHP?
- 7. Estadísticas de SQL Server
- 8. Analizador de SQL Server: no se muestran/faltan las plantillas
- 9. SQL Server 2008 a SQL Server 2005
- 10. Analizador de SQL - ¿Qué podría mejorarse?
- 11. SQL Server
- 12. mysql_real_escape_string alternativa para SQL Server
- 13. Buena referencia para SQL para usar con SQL Server 2008
- 14. ¿equivalente StyleCop para SQL Server?
- 15. SQL Server para cada lazo
- 16. puerto predeterminado para SQL Server
- 17. Clasificación natural para SQL Server?
- 18. Analizador de tablas y columnas SQL para procedimientos almacenados
- 19. ¿Redondeo en SQL Server?
- 20. Drop table en Sql Server por Sql Server Management Studio
- 21. UNIX_TIMESTAMP en SQL Server
- 22. Tipo de datos sql para clave principal - SQL Server?
- 23. degradación de SQL Server 2008 a SQL Server 2005
- 24. Analizador de SQL Server: cómo filtrar trazas para mostrar solo eventos de una base de datos?
- 25. Analizador YAML en Delphi?
- 26. Declaración de variables SQL - SQL Server
- 27. Cambiando de usar SQL Server Express a SQL Server Compact
- 28. SQL Server para probar en la web
- 29. Plantilla básica para transacciones en SQL Server
- 30. Mejores prácticas para PK en SQL Server
No es exactamente la misma pregunta, pero podría valer la pena un vistazo : ttp: //stackoverflow.com/questions/615608/need-in-sql-parser-on-delphi –
Sí, pero es para Firebird, no para el servidor sql. Y hay diferencias entre ellos. –
Con cte's, consultas anidadas, insertar/soltar/actualizar/alterar/etc declaraciones, este es un código no trivial. Realmente, la única forma segura de analizar una consulta de servidor SQL es con el servidor sql. –