2008-11-12 11 views
5

¿Existe una aplicación que pueda analizar un conjunto determinado de procedimientos almacenados (SQL Server 2000) y obtenga todas las tablas y columnas asociadas que se utilizan en ella? El procedimiento almacenado puede tener tablas de diferentes bases de datos.Analizador de tablas y columnas SQL para procedimientos almacenados

de salida debe ser como TableA Columna ColumnC columnD

TableB columnE columnF columnG

He escrito una pequeña aplicación que utiliza la base de datos Edición RDA Cualquier interesado puede referirse a http://tsqlparsergdr.codeplex.com

+0

No creo que la expresión regular sea la solución correcta, necesita un analizador SQL en su lugar, consulte este artículo: http://www.dpriver.com/blog/list-of-demos-illustrate-how-to-use-general-sql-parser/get-columns-and-tables-in-sql-script-net-version/ –

Respuesta

1

Puede usar el ajuste SHOWPLAN_ALL y analizar la salida.

+0

Es una buena sugerencia, pero no funciona para mí. – rsapru

+0

por favor, defina "no funciona". o mejor aún, defina lo que funciona :) –

+0

Por qué no funcionó para mí es porque la mayoría de los procedimientos almacenados en los que estoy trabajando, no tengo todos los DB a los que se refieren. y SHOWPLAN_ALL parece funcionar solo si tiene todo el DB presente. Es un tipo de trabajo de análisis que debo hacer. – rsapru

2

No es una solución concreta - pero una línea de pensamiento.

Considerado sysdepends como una posible solución, pero es notoriamente poco fiable al contener todos la información del objeto dependiente.

pero ¿qué tal algo derivado de Lex/Yacc? Hay algunos analizadores comerciales, p.

http://www.sqlparser.com/download.php

No parecía para la implementación de código abierto, pero creo que me gustaría ver para esa ruta. Así es como empecé mi búsqueda:

http://www.google.com/search?hl=en&q=sql+lex+yacc+parse

sintaxis BNF para ANSI SQL se puede encontrar aquí:

http://savage.net.au/SQL/

Con una aplicación de la lex de elección, esto parece un problema de ingeniería relativamente directo desde aquí. (Aunque con cierta heavylifting si quieres apoyar extensiones de MS SQL)

+0

http://www.sqlparser.com/ download.php Se ve genial pero no puede comprarlo. Necesita algún tipo de fuente abierta o freeware. – rsapru

+0

O'Reilly's YACC & Lex book tiene una muestra de un analizador SQL basado en yacc. (http://safari.oreilly.com/9781565920002/sql_parser_code) Puede encontrar otras implementaciones públicas. Que un producto comercial incluso existe te dice que es un recurso escaso. – stephbu

+1

Finalmente pude crear una usando la base de datos Edition GDR .. http://tsqlparsergdr.codeplex.com – rsapru

-1

Usted podría llamar a los procedimientos almacenados mediante programación (en un entorno de desarrollo) y obtener las columnas resultantes. Tal vez tenga una convención de nomenclatura para evitar llamar al procedimiento de inserción y actualización. Tendrás que encontrar la manera de establecer los parámetros correctos también.

Nota: Creo que una solución 100% confiable es técnicamente imposible, debido a la forma en que funciona el procedimiento almacenado.

vistazo a este ejemplo:

[...] 
@MyDate datetime 

AS 

    IF (day(@MyDate) = 1) 
    BEGIN 
     SELECT * FROM MyFirstTable 
     RETURN 
    END 

    IF (@MyDate > getdate()) 
     SELECT MyID, MyText FROM MySecondTable WHERE ADate > @MyDate 
    ELSE 
     EXEC Other_StoredProcedure @MyType, @MyDate 

Así que hay dos problemas: las columnas resultantes podrían ser diferentes y usted tendrá que seguir de forma recursiva otros procedimientos almacenados.

+0

El análisis de salida tiene demasiados defectos para ser viable. De acuerdo con la nota general, aunque suponiendo que analizará todos los proc declarados explícitamente, aún existe la posibilidad de invocar implícitamente los procedimientos a través de cadenas SQL dinámicas, que de nuevo tendría que analizar, etc. – stephbu

+0

Lo siento, tal vez era no es claro. No me refiero a "analizar" el resultado, sino a obtener las columnas resultantes de una manera normal, simplemente llamando al procedimiento almacenado. Editaré mi respuesta. – splattne

+0

Ok, tal vez he entendido mal la pregunta. Pero no estaba claro para mí, lo que rsapru significa "dígame qué se están usando todas las tablas y columnas dentro de esa tabla". – splattne

0

sp_depends deben ayudar

+0

no, esto no funciona para mí, lo probé – rsapru

1

decidió crear una pequeña aplicación que utiliza expresiones regulares para satisfacer mis necesidades actuales.

Gracias a todos por sus respuestas.

1

sp_depends Funcionó perfectamente para mí. Mostró qué tabla o SP podría verse afectado por mis cambios

+0

Esto funciona mucho mejor ahora (SQL Server 2008). La Q está etiquetada como SQL Server 2000, aunque las dependencias son muy sobrias. –

+0

Lo siento, no vi eso – DonP

Cuestiones relacionadas