Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con Cursor

Estas en el tema de Problema con Cursor en el foro de SQL Server en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/07/2017, 20:00
 
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
  #2 (permalink)  
Antiguo 13/07/2017, 11:21
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Problema con Cursor

Hola

Verifique el resultado de estas dos consultas, ¿podria tomar los datos de este resultado?

Código SQL:
Ver original
  1. SELECT * FROM INFORMATION_SCHEMA.ROUTINES
  2. SELECT * FROM INFORMATION_SCHEMA.TABLES
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 13/07/2017, 11:25
 
Fecha de Ingreso: febrero-2008
Mensajes: 65
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Problema con Cursor

Cita:
Iniciado por iislas Ver Mensaje
Hola

Verifique el resultado de estas dos consultas, ¿podria tomar los datos de este resultado?

Código SQL:
Ver original
  1. SELECT * FROM INFORMATION_SCHEMA.ROUTINES
  2. SELECT * FROM INFORMATION_SCHEMA.TABLES
Hola! Lo solucioneponiendo la palabra LOCAL! al momento de crear el cursor

"CURSOR LOCAL FOR...."
  #4 (permalink)  
Antiguo 14/07/2017, 07:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con Cursor

Y para que el cursor? porque no haces el insert directamente? no veo que tengas ninguna validacion ni que revises linea por linea los resultados?


podrias hacer algo como esto:

Código SQL:
Ver original
  1. DECLARE @query Nvarchar(MAX)
  2. DECLARE @db Nvarchar(10)
  3.  
  4. SET @query='insert into resultado
  5. select * from ' + @db + 'information_schema.tables'
  6. sp_executesql @query
No veo la necesidad de usar un cursor.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 19/07/2017, 10:14
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Problema con Cursor

Bueno Mr. Libras, hay gente que para matar una cucharacha utiliza una AK-47, asi de simple....cada quien mata la cucaracha como mas le guste.
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 19/07/2017, 10:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con Cursor

Cita:
Iniciado por iislas Ver Mensaje
Bueno Mr. Libras, hay gente que para matar una cucharacha utiliza una AK-47, asi de simple....cada quien mata la cucaracha como mas le guste.
A no bueno en eso usted tiene razon.....

P.D: Me tome la libertad de robarle la frase
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: case, cursor, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:00.