Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/07/2017, 20:00
Juan228
 
Fecha de Ingreso: febrero-2008
Mensajes: 65
Antigüedad: 16 años, 2 meses
Puntos: 0
Problema con Cursor

Hola a todos, les comento:

Yo le envio a mi SP El nombre de una Base de Datos (Por ejemplo AdventureWorks) y el nombre de un schema (Por Ejemplo HumanResources) y en base a eso tengo que crear una nueva tabla "Resultado" en donde figuren todos los SP y Tablas que componen ese Schema.

Entre los datos que me piden esta que si es una TABLA indique si posee PK y FK, por lo cual a traves del INFORMATION_SCHEMA obtengo por una parte las tablas y por el otro las constraint, por lo cual tendria que hacer un join.


Los problemas en este caso son 2:
  1. Yo estoy parado sobre otra base de datos y estas consultas las hago contra AdventureWorks
  2. Tengo que recorrer SI O SI las filas por que cada fila puede tener diferentes resultados

Asi que lo que se me ocurrio, aunque poco practico, es usar dentro de mi SP un cursor, pero me da el error:

Could not complete cursor operation because the set options have changed since the cursor was declared.


Les dejo el codigo completo a ver si me pueden ayudar por qeu me estoy volviendo loco!!

Código SQL:
Ver original
  1. -- ======================================================= --
  2. -- ===========> CREACION DE STORAGE PROSEDURE <=========== --
  3. -- ======================================================= --
  4.  
  5. CREATE PROCEDURE sp_grabar @SCHEMA VARCHAR(50), @DB VARCHAR(50)
  6. AS
  7. BEGIN
  8.  
  9. DECLARE @ERRORMSJ VARCHAR(MAX)      -- Variable de Mensaje de Error
  10. DECLARE @PK VARCHAR(2)              -- Variable de SI o NO
  11. DECLARE @PK_Compuesta VARCHAR(2)    -- Variable de SI o NO
  12. DECLARE @FK VARCHAR(2)              -- Variable de SI o NO
  13. DECLARE @FK_Compuesta VARCHAR(2)    -- Variable de SI o NO
  14. DECLARE @CANTIDAD INT               -- Variable Acumuladora
  15. DECLARE @query NVARCHAR(MAX)        -- Variable para consultas dinamicas
  16. DECLARE @INICIO INT                 -- Variable para recorrer el while
  17. DECLARE @cambiarDB VARCHAR(MAX)     -- Declaro una variable para poder cambiar de DB en el codigo
  18.     SET @cambiarDB='USE '+@DB+ '; '
  19.  
  20. BEGIN TRY
  21.     ---------------------------------------------------------------------------
  22.     -- ================> Verifico si la Base de Datos Existe <============== --
  23.     ---------------------------------------------------------------------------
  24.     /*
  25.     SET @ERRORMSJ = 'ERROR: La Base de Datos no existe'
  26.     IF DB_ID(@DB) IS NULL RAISERROR(@ERRORMSJ,16,1)
  27.     */
  28.     ---------------------------------------------------------------------------
  29.     -- ======================> Verifico PK y PK COMPUESTA <==================== --
  30.     ---------------------------------------------------------------------------
  31.  
  32.     ---------------------------------------------------------------------------
  33.     -- ===========> Hago los Insert para las Tablas del Esquema <=========== --
  34.     ---------------------------------------------------------------------------
  35.     -- Declaro el cursor
  36.     SET @query=@cambiarDB+'DECLARE cursorTablas CURSOR LOCAL FOR(SELECT * FROM INFORMATION_SCHEMA.TABLES)'
  37.     EXECUTE sp_executesql @query
  38.  
  39.     -- Declaro variables para manejar el cursor
  40.     DECLARE @TABLE_CATALOG NVARCHAR(MAX)
  41.     DECLARE @TABLE_SCHEMA NVARCHAR(MAX)
  42.     DECLARE @TABLE_NAME NVARCHAR(MAX)
  43.     DECLARE @TABLE_TYPE NVARCHAR(MAX)
  44.  
  45.     -- Hago la apertura del Cursor
  46.     OPEN cursorTablas
  47.  
  48.     -- Recorro el Cursor
  49.     FETCH NEXT FROM cursorTablas INTO @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME, @TABLE_TYPE
  50.         WHILE @@FETCH_STATUS = 0
  51.         BEGIN
  52.             INSERT INTO Resultado(esquema, base, objeto, tipoObjeto) VALUES (@TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME, @TABLE_TYPE)
  53.  
  54.             FETCH NEXT FROM cursorTablas INTO @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME, @TABLE_TYPE
  55.         END
  56.    
  57.     close cursorTablas
  58.     Deallocate cursorTablas
  59.  
  60.     /*
  61.     SET @query='INSERT INTO Resultado(esquema, base, objeto, tipoObjeto) SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE  
  62.                 from ' + @DB + '.INFORMATION_SCHEMA.TABLES where TABLE_TYPE=' +'''BASE TABLE''' + ' AND TABLE_SCHEMA=' + '''' + @SCHEMA + ''''
  63.  
  64.     EXEC sp_executesql @query
  65.     */
  66.  
  67.    
  68.     ---------------------------------------------------------------------------
  69.     -- =============> Hago los Insert para los SP del Esquema <============= --
  70.     ---------------------------------------------------------------------------
  71.     SET @query='INSERT INTO Resultado(esquema, base, objeto, tipoObjeto, parametros) SELECT DISTINCT rou.SPECIFIC_CATALOG as Base, rou.SPECIFIC_SCHEMA as Esquema, rou.ROUTINE_NAME as Nombre, rou.ROUTINE_TYPE as Tipo,
  72.                 CASE WHEN par.PARAMETER_MODE IN (''IN'',''INOUT'') THEN ''SI'' ELSE ''NO'' END as Parametros
  73.                 FROM ' + @DB + '.INFORMATION_SCHEMA.ROUTINES as rou
  74.                     INNER JOIN ' + @DB + '.INFORMATION_SCHEMA.PARAMETERS as par
  75.                     ON rou.ROUTINE_NAME = par.SPECIFIC_NAME
  76.                 WHERE ROUTINE_TYPE = ''PROCEDURE'' AND rou.SPECIFIC_SCHEMA = ' + '''' + @SCHEMA + ''''
  77.  
  78.     EXEC sp_executesql @query
  79.  
  80. END TRY
  81.  
  82. BEGIN CATCH -- Inserto el error en la tabla de Logs de Errores
  83.  
  84.     INSERT INTO LOGERRORES (descripcion, error, fila, errorLinea, errorMensaje, errorProcedure, errorNumero, errorSeveridad, errorEstado, fececha, idUsuario) VALUES
  85.             (@ERRORMSJ, @@ERROR, @@ROWCOUNT, ERROR_LINE(), ERROR_MESSAGE(), ERROR_PROCEDURE(), ERROR_NUMBER(), ERROR_SEVERITY(),ERROR_STATE(), GETDATE(),SYSTEM_USER)
  86.  
  87.     RAISERROR (@ERRORMSJ, 16 , 1)
  88.  
  89. END CATCH
  90.  
  91. END
  92. GO
  93.  
  94.  
  95. -- ======================================================= --
  96. -- ===================> CONSULTAS <======================= --
  97. -- ======================================================= --
  98. /* */
  99. EXEC sp_grabar HumanResources, AdventureWorks
  100.  
  101. ---------------------------------------------------------------------------
  102. -- =======================> Listado de Select <========================= --
  103. ---------------------------------------------------------------------------
  104. SELECT * FROM Auditoria
  105. SELECT * FROM LOGERRORES
  106.  
  107. SELECT  esquema AS ESQUEMA,
  108.         base AS BASE,
  109.         objeto AS OBJETO,
  110.         ISNULL(tipoObjeto,' ') AS 'TIPO DE OBJETO',
  111.         ISNULL(parametros,' ') AS PARAMETROS,
  112.         ISNULL(pk,' ') AS PK,
  113.         ISNULL(pkCompuesta,' ') AS 'PK COMPUESTA',
  114.         ISNULL(fk,' ') AS FK,
  115.         ISNULL(fkCompuesta,' ') AS 'FK COMPUESTA'
  116. FROM Resultado