Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Souto

Cursor com erro

Recommended Posts

/*

Bom dia galera, sou novo por aqui e gostaria de me apresentar, me chamo Claudio Souto, mais conhecido por Souto.

Conheci este fórum através de pesquisas na net e por ter alguns problemas não solucionáveis por mim mesmo no SQL Server 2000, então já vou deixar uma duvida que não consigo resolver de jeito nenhum.

 

Preciso melhorar a performance dos bancos da empresa onde trabalho e cheguei a seguinte conclusão:

 

Pensei, vai ser fácil refazer os índex de todas as tabelas, mole, montarei uma cadeia de cursores e ta resolvido o problema.

Antes eu tinha um problema hoje tenho dois problemas e nenhum resolvido.

Desta forma, pergunto, alguém sabe ou tem idéia de como eu posso resolver o problema abaixo?

*/

USE MASTER

GO
DECLARE @DATABASE VARCHAR (500)
DECLARE @TABELA VARCHAR (500)
DECLARE @INDEX VARCHAR (500)

--Buscando todas as bases de dados do servidor SQL Server 2000
DECLARE Cursor_DATABASE cursor fast_forward
  FOR     SELECT NAME FROM MASTER..SysDatabases
OPEN Cursor_TABELA
  FETCH NEXT FROM Cursor_DATABASE INTO @DATABASE
  WHILE (@@FETCH_STATUS = 0)
  BEGIN
--Buscando as tabelas das bases encontradas no Cursor_DATABASE
  USE @DATABASE
     DECLARE Cursor_TABELA CURSOR
        FOR   SELECT NAME FROM @DATABASE..SysObjects WHERE XTYPE = 'U'
     OPEN Cursor_TABELA
        FETCH NEXT FROM Cursor_TABELA
        INTO @TABELA
        WHILE (@@FETCH_STATUS = 0)
        BEGIN
--Buscando os Índex das tabelas das bases encontradas no Cursor_TABELA
        DECLARE Cursor_INDEX CURSOR
           FOR   SP_HELPINDEX @TABELA
        OPEN Cursor_INDEX
           FETCH NEXT FROM Cursor_INDEX
           INTO @INDEX
           WHILE (@@FETCH_STATUS = 0)
           BEGIN
           PRINT @DATABASE+'   '+@TABELA+'   '+@INDEX
--Fim do 3º Cursor - Cursor_INDEX
        FETCH NEXT FROM Cursor_INDEX INTO @INDEX
        END
        CLOSE Cursor_INDEX
        DEALLOCATE Cursor_INDEX
--Fim do 2º Cursor - Cursor_TABELA
     FETCH NEXT FROM Cursor_TABELA INTO @TABELA
     END
     CLOSE Cursor_TABELA
     DEALLOCATE Cursor_TABELA
--Fim do 1º Cursor - Cursor_DATABASE
FETCH NEXT FROM Cursor_DATABASE INTO @DATABASE
END
CLOSE Cursor_DATABASE
DEALLOCATE Cursor_DATABASE

 

/*

Esse cursor tem a finalidade de localizar todos os bancos de dados e suas tabelas com seus respectivos índex de forma dinâmica.

Só que não funciona.

 

Obs.: o meu conhecimento em SQL SERVER é muito superficial, comecei a mexer essa semana com o danado.

 

Att,

Souto

*/

Compartilhar este post


Link para o post
Compartilhar em outros sites

No SQL SERVER 2000 procedures sao executadas sem o EXEC??? pq o 2005/2008 elas só podem ser executadas pelo EXEC e se no sql 2000 tambem só executar com o EXEC entao na sua linha esta errado.

 

" DECLARE Cursor_INDEX CURSOR

FOR SP_HELPINDEX @TABELA "

 

e outra coisa aqui esta um artigo que falar 3 metodos que é muiito mais rapido que o cursor !!!

 

 

http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=24

Compartilhar este post


Link para o post
Compartilhar em outros sites

No SQL SERVER 2000 procedures sao executadas sem o EXEC??? pq o 2005/2008 elas só podem ser executadas pelo EXEC e se no sql 2000 tambem só executar com o EXEC entao na sua linha esta errado.

 

" DECLARE Cursor_INDEX CURSOR

FOR SP_HELPINDEX @TABELA "

 

e outra coisa aqui esta um artigo que falar 3 metodos que é muiito mais rapido que o cursor !!!

 

 

http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=24

 

Caro GuilhermeTI, obrigado pela resposta.

Mas o teu artigo, também não me ajudou em nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No SQL 2005 sempre executei as procedures sem o EXEC.

 

 

Cara, você tem o SQL 2005 ? Pode usar o Generate Script dele para pegar todos os indices. Traz até o create do indice para você.

Sempre conecto no SQL 2000 pelo Management Studio, funciona uma beleza. Essa parte de pegar o script não me lembro se eu cheguei a fazer. Mas se conecta, deve dar para fazer sim.

Imagem Postada

 

 

Microsoft SQL Server Management Studio Express Download

 

ou

 

Procure por "execute dynamic query's", pode ser que ajude no seu script. Você não pode fazer isso:

SELECT NAME FROM @DATABASE..SysObjects WHERE XTYPE = 'U'

 

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT NAME FROM @DATABASE..SysObjects WHERE XTYPE = 'U'

 

O código acima realmente não rola. Use a sp_executesql para executar um SQL com variáveis ;)

 

http://msdn.microsoft.com/en-us/library/ms188001.aspx

Compartilhar este post


Link para o post
Compartilhar em outros sites

CREATE PROCEDURE P_MAPEAMENTO  @DATABASE VARCHAR(50)
AS BEGIN

SET QUOTED_IDENTIFIER OFF
DECLARE @query varchar(500)
set @query = 
			'SELECT O.NAME as [Nome da tabela],
			 I.NAME as [Nome dos indices],
			 I.type_desc as [Tipo do indice]


FROM ' + @database +'.sys.indexes I INNER JOIN ' + @database +'.sys.SYSOBJECTS O 
ON I.object_id = O.id  WHERE O.xtype =  "U"   AND I.name NOT LIKE  "_WA_SYS%"'
EXEC(@query) 
 END 

EXEC P_MAPEAMENTO (BANCO QUE VOCE QUER VER)

 

 

NO SQL 2005 FUNCIONA! DA PRA VER TABELAS, ÍNDICES DO BANCO DE DADOS, MAS VOCE TEM QUE COLOCAR QUAL O DB QUE você QUER!!

 

OBS: eu tentei colocar todos o bancos de dados na consulta mas e muita treta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.