Ir para conteúdo
Fórum Script Brasil

fulvio

Moderadores
  • Total de itens

    1.218
  • Registro em

  • Última visita

Tudo que fulvio postou

  1. Bom dia Ligerinho, Os dados estão sendo inseridos no BD da forma '1','2','3',... ? O campo @ListaFunc_IDs é identificado como varchar. Quando você fizer SELECT FUNC_ID FROM FUNCIONARIOS WHERE FUNC_ID IN (@ListaFunc_IDs), o SQL vai dar erro. Outra coisa: se você tiver comparando campos inteiros, não há a necessidade as aspas simples. O campo pode ficar da forma 1,2,3... Creio q esta implementação não funcionará desta forma. Ao montar o script, o SQL identificará alguns caracteres reservados gravados na Base (que seria a aspas simples e a vírgula). Ocorrerá erro na execução. Mas vamos lá. Se quiser atribuir a string '1','2','3',... para uma variável: DECLARE @Dados VARCHAR(500) set @Dados = '''1'',''2'',''3''' SELECT @Dados Se você fizer WHERE FUNC_ID IN (@Dados), dará um erro de conversão. O q pode ser feito é concatenar o script, jogá-lo em uma variável e mandar executar a variável. Ficaria assim: DECLARE @Dados VARCHAR(500) set @Dados = '''1'',''2'',''3''' SELECT @Dados DECLARE @SQL VARCHAR(500) Set @SQL= 'SELECT * FROM FUNCIONARIOS WHERE FUNC_ID IN (' + @Dados + ')' select @SQL -- O comando abaixo é para executar a variável @SQL Exec (@SQL) - O melhor seria você retirar as aspas simples dos números. você terá problemas em qualquer SQL q fizer. - O ideal mesmo é inserir cada participante em uma linha, com a coluna int. :.) Faz os testes aí e depois me fala se deu certo.
  2. fulvio

    Consulta com join

    Bom dia Victor, Como os dados referentes aos meses são dinâmicos, fica um pouco complicado realizar as manipulações com script´s que não sejam dinâmicos. Se em todos os meses do ano tivesse alguma inserção, você teria que implementar 12 meses no seu select "Louco" (rs...). Criei duas temporárias e manipulei os dados da tabela "Teste" que passou. Sendo assim, dê carga na tabela e depois rode o script abaixo. Selecione tudo e mande rodar!! Uma dúvida: tem como ocorrer dois "Nome_Regional" e "Nome_Convenio" iguais, com quantidades diferentes, tipo: Leste Banco 300 Leste Banco 400 Neste caso, teria que realizar uma somatória nestes valores. A implementação abaixo não realiza isto. Faça os testes aí... :.) --Drop table #Total --Drop table #Meses create table #Total (Controle int Identity, Nome_Regional Varchar(10), Nome_Convenio Varchar(10)) create table #Meses (Mes Varchar(3), Controle int Identity) Declare @Cont int Declare @SQL varchar(200) Set @Cont=1 -- Inserção dos meses na temporaria Insert into #Meses (Mes) select distinct Mes from Teste -- Inserção das colunas meses na tabela Principal While @Cont <= (select max(controle) from #Meses) Begin Set @SQL = 'alter table #Total add ' + (select Mes from #Meses where Controle=@Cont) + ' int' exec (@SQL) Set @Cont = @Cont + 1 End -- Inserção das Regionais e Convenios insert into #Total (Nome_Regional, Nome_Convenio) select distinct Nome_Regional, Nome_Convenio from Teste Set @Cont=1 -- Inserção da Quantidade Atendimentos While @Cont <= (select max(controle) from #Meses) Begin Set @SQL = 'update #Total set ' + (select mes from #Meses where controle=@Cont) + '=Qtde_Atendimentos from #Total t, Teste te where t.Nome_Regional=te.Nome_Regional ' + 'and t.Nome_Convenio=te.Nome_Convenio and te.mes=' + '''' + + (select mes from #Meses where controle=@Cont)+ '''' exec (@SQL) Select @Cont = @Cont + 1 End select * from #total
  3. Boa tarde Nilton, Antes de realizar os testes, backup é sempre bom... rs. O seu Banco está como "Auto Shrink". Se não tiver, pode colocá-lo. Tente executar: CHECKPOINT GO EXEC SP_SPACEUSED GO BACKUP LOG Meu_Banco WITH TRUNCATE_ONLY GO DBCC SHRINKFILE(Meu_Arquivo_Log', TamanhoLogMB) GO DBCC SHRINKDATABASE('Meu_Banco', TRUNCATEONLY) GO DBCC SHRINKDATABASE ('Meu_Banco', TamanhoBdMB) GO EXEC SP_SPACEUSED Verifique o tamanho. Após estas manipulações, o tamanho físico pode ter diminuido, mas o lógico não. Pode-se utilizar a procedure sp_updatestats. Verifique o tamanho. você pode reindexar as tabelas, utilizando o comando DBCC DBReindex('Tabela_1',''). Verifique o tamanho. Faça os testes. Caso nada dê certo, faça o seguinte: - Crie uma nova Base de Dados. - Insira todas as tabelas nesta base. - Recrie as estruturas de indices e chaves estrangeiras. - Se tiver espaço, pode utilizar o copy database. - Pode fazer também attach/detach no arquivo mdf. Bem, creio q minhas opções acabaram... rs. Dê uma olhada se consegue diminuir o tamanho com isto.
  4. Bom dia Nilton, você está utilizando o SQL 2000, ok? Vamos às observações: - Quando se cria um Banco, você identifica a tamanho minimo que ocupará. Mesmo sem dados nenhum, o mesmo ocupará o espaço minimo estipulado. - Ver quanto de espaço foi destinado para o log. - Caso seja o SQL 2000, vá no Enterprise, clique com o botão direito no Banco, selecione Todas as Tarefas / Shrink Database. Nesta aba encontrará informações para redução do espaço do Banco. - Caso seja o SQL 2005 (apenas informativo), vá no Server Management, clique com o botão direito no Banco, selecione Tasks / Shrink / Database. Nesta aba encontrará informações para redução do espaço do Banco. Em relação ao travamento do Enterprise, não conheço nenhum caso. Tente recriar a tabela. Insira os dados via Query Analyzer e depois pelo Enterprise. Espero ter ajudado.. :.)
  5. Bom dia Fellipe, Não conheço nenhum aplicativo que faça isto. Mas se quiser fazer na mão, será um bom exercício!! rs. Mas lembre que o cliconfg é um aplicativo. Segue os passos caso queira exercitar. Os passos estão bem resumidos, mas não é tão simples assim: - você deverá ter um aplicativo de Debugger. - você pode debugar o cliconfg.exe, mas precisará conhecer Assembly. - Vá navegando até o ponto onde os dados são inseridos (guia Alias, TCP/IP, etc), e olhe em seu descompilador quais registros são manipulados (neste ponto, pode-se fazer um BAT para manipulação). Fixe o IP e Porta que precisa. - Compile novamente o cliconfg.exe, mas com outro nome para não sobrepor. - Faça os testes com o novo aplicativo. :.)
  6. Bom dia Alexandre, Caso o resultado fosse apenas as duas primeiras colunas "REGNR" e "DATA", seria mais fácil a implementação: select distinct REGNR, max(data) from A group by REGNR Mas a coluna "PV" ficará de fora. Para resolver este problema, criei uma temporária e inseri os dados. Segue o script com umas inserções de teste. --Criação de temporária em instância para inserção dos dados create table #teste (REGNR int, DATA datetime, PV int) -- Inserção dos dados insert into #teste values (100, '2010-06-25', 8900) insert into #teste values (100, '2008-06-10', 1002 ) insert into #teste values (100, '1943-06-12', 8999) insert into #teste values (100, '1957-06-25', 2882) insert into #teste values (100, '2009-02-01', 8900) insert into #teste values (110, '2010-02-14', 1000) --Depois de dar carga na tabela, seleciona tudo abaixo e executa. declare @Resultado table (REGNR int, DATA datetime, PV int) insert into @Resultado (REGNR, DATA) select distinct REGNR, max(data) from #teste group by regnr update @Resultado Set PV=t.PV from @Resultado r, #teste t where r.REGNR=t.REGNR and r.DATA=t.DATA select * from @Resultado
  7. Tópico movido para Fórum Script Brasil > Banco de Dados > Demais Bancos
  8. Quando se utiliza o UNION, as colunas de retorno devem ser do mesmo tipo. A ordem também deve ser lavada em consideração. Se o 1º select possui as colunas titulo, data, o 2º também tem q conter uma coluna do tipo caracter e data. No seu caso, titulo e alguma data. Tente pegar a data da tabela Cds. Ex.: SELECT titulo, data FROM Noticias WHERE titulo LIKE '%taurus%' UNION SELECT titulo, DataTabelaCds FROM Cds WHERE titulo LIKE '%taurus%' Se não tiver, pode-se colocar NULL: SELECT titulo, data FROM Noticias WHERE titulo LIKE '%taurus%' UNION SELECT titulo, NULL FROM Cds WHERE titulo LIKE '%taurus%'
  9. Boa tarde Marvi, Fiz duas tabelas temporárias para exemplificar. Cria as tabelas, insere os dados e depois roda o select. create table #Noticias (titulo varchar(100), conteudo varchar(100)) create table #Cds (titulo varchar(100), conteudo varchar(100)) insert into #Noticias values ('João e Maria', 'se casaram hoje joão e maria.') insert into #Cds values ('João e seus sucessos', 'As melhores músicas de joão') select * from #Noticias select * from #Cds select titulo from #Noticias where titulo like 'João%' UNION select titulo from #Cds where titulo like 'João%'
  10. Bom dia Flávio, Quando você possui uma grande Base de Dados, é normal algumas consultas ficarem muito grandes. Tem umas que dá até medo de mexer... rs. Para melhor o entendimento / implementação / manutenção, pode-se utilizar uma Procedure. Nela, há a possibilidade de utilizar temporárias, variáveis, etc. A implementação fica mais "limpa". No fonte tem como fazer do mesmo jeito, mais fica um pouco ruim. Só lembrando que: o processamento da procedure não é concorrente! Caso tenha mais de uma solicitação, sua execução será enfileirada. Pode-se criar uma VIEW (visão). A maioria das vezes esta é a melhor forma. Quando há a necessidade de recuperar dados em várias tabelas, cria-se uma view em que nela encontra-se os dados que necessita. Qualquer dúvida, pode postar. :.)
  11. Boa tarde Thiago, A implementação fiz bem básica. Agora é só inserir mais umas consistências e verificações, de acordo com as necessidades. Ah, e testar... rs. Que bom que funcionou!! Precisando estamos ai. :.)
  12. fulvio

    SQL Server 2000

    Exatamente. Para o aplicativo fazer isto, teria que pegar todas as linhas... É... neste caso teria que fazer um teste para ver a melhor alternativa. Falo isto pois deve-se levar em consideração a máquina do cliente, banda, servidor, etc. Achei muito foi a quantidade de dados a serem paginadas (50 mil linhas). Creio que a melhor alternativa mesmo seria via Banco. De preferência, não utilize cursor. Crie uma temporária com uma coluna de controle, auto incremental e indexada. Aí você realiza a paginação utilizando esta coluna. Lembrando que o peso não estará no processamento, mas no I/O de banco. Depois de ler todas as 50 mil linhas, paginando de 15 em 15, você terá feito 3.333 acessos à Base. :.)
  13. fulvio

    SQL Server 2000

    Boa tarde Sunpb, Não entedi... você quer enviar pro aplicativo 50 mil linhas para ele tratar? Se fizer isto, você estará carregando não somente o Banco, mas a banda e a máquina cliente... rs. Pegue no Banco apenas o que precisar. Se você quiser 15 linhas, faça o script para retornar apenas isto. :.)
  14. Pessoal, Fiz uma função no SQL Server para converter um número para Moeda brasileira. Postei esta função no Fórum e decidi colocar aqui também. Quem quiser implementar outras verificações / regras, fiquem a vontade!!! :.) Funcionamento: - Entrada de dados - números no formato XXX , XXX.X , XXX.XX , XXX.XXX - Caso o número tenha mais de duas casas decimais: serão suprimidas. - Formato de retorno: R$ XXX,XX Script: create function ConverteMoedaReal (@Numero varchar(40)) Returns Varchar(40) -- Implementado por Fulvio Duarte -- MSN: daasabh@hotmail.com as Begin Declare @Contador int Declare @Pontos int Declare @CasasVirgula int Declare @Parte1 varchar(40) Declare @Parte2 varchar(40) set @CasasVirgula = (len(substring (@Numero, charindex('.', @Numero)+1, len (@Numero)))) if @CasasVirgula > 2 Set @Numero = (substring (@Numero, 1, (charindex('.', @Numero)) + 2) ) If charindex('.', @Numero) <> 0 Begin set @Numero = replace(@Numero, '.', ',') If len(substring(@Numero, charindex(',', @Numero)+1, 2)) = 1 Set @Numero = @Numero + '0' End Else Set @Numero = @Numero + ',00' Set @Contador = (charindex(',', @Numero)-1) Set @Pontos = @Contador/3 While @Pontos <> 0 Begin Set @Contador = @Contador-3 Set @Parte2 = (substring (@Numero, @Contador+1, len(@Numero))) Set @Parte1 = (substring (@Numero, 1, (charindex(@Parte2, @Numero)-1))) Set @Numero = @Parte1 + '.' + @Parte2 Set @Pontos = @Pontos - 1 End if (substring (@Numero, 1,1)) = '.' Set @Numero = (substring (@Numero, 2,len(@Numero))) Set @Numero = 'R$ ' + @Numero return @Numero end Para chamar a função: select dbo.ConverteMoedaReal ('5120362.20') Se quiser utilzar convertendo uma coluna: select dbo.ConverteMoedaReal (NomeColuna) from TABELA where ....
  15. fulvio

    SQL Server 2000

    Boa tarde, Prefira sempre que o aplicativo trate os dados. Igual você falou, não deixe que o Banco de Dados faça este serviço. rs. O problema de temporárias e cursores no Banco é a utilização de processamento e principalmente memória. O MySQL possui a funcionalidade LIMIT para fazer paginação. Mas no SQL Server não há. Recupere os dados que deseja, passe para o aplicativo e trate os dados nele. :.)
  16. Boa tarde Raposo, Já tentou o DBConvert?
  17. Bom dia Thiago, O Sql Server não possui nenhuma função para realizar esta formatação. Sendo assim, criei uma função para esta conversão. Como funciona: - você terá que passar o número para a função no formato: XXX ou XXX.X ou XXX.XX (número inteiro, com 1 ou 2 casas depois do ponto). - Se você colocar mais de 2 casas após o ponto, será suprimida as demais casas, deixando apenas 2. Vou aproveitar e colocar o script na parte de Tutoriais & Dicas - SQL Server :.) Segue o script para criação da função: create function ConverteMoedaReal (@Numero varchar(40)) Returns Varchar(40) -- Implementado por Fulvio Duarte -- MSN: daasabh@hotmail.com as Begin Declare @Contador int Declare @Pontos int Declare @CasasVirgula int Declare @Parte1 varchar(40) Declare @Parte2 varchar(40) set @CasasVirgula = (len(substring (@Numero, charindex('.', @Numero)+1, len (@Numero)))) if @CasasVirgula > 2 Set @Numero = (substring (@Numero, 1, (charindex('.', @Numero)) + 2) ) If charindex('.', @Numero) <> 0 Begin set @Numero = replace(@Numero, '.', ',') If len(substring(@Numero, charindex(',', @Numero)+1, 2)) = 1 Set @Numero = @Numero + '0' End Else Set @Numero = @Numero + ',00' Set @Contador = (charindex(',', @Numero)-1) Set @Pontos = @Contador/3 While @Pontos <> 0 Begin Set @Contador = @Contador-3 Set @Parte2 = (substring (@Numero, @Contador+1, len(@Numero))) Set @Parte1 = (substring (@Numero, 1, (charindex(@Parte2, @Numero)-1))) Set @Numero = @Parte1 + '.' + @Parte2 Set @Pontos = @Pontos - 1 End if (substring (@Numero, 1,1)) = '.' Set @Numero = (substring (@Numero, 2,len(@Numero))) Set @Numero = 'R$ ' + @Numero return @Numero end Para chamar a função: select dbo.ConverteMoedaReal ('5120362.20') Se você quiser utilzar, convertendo uma coluna: select dbo.ConverteMoedaReal (NomeColuna) from TABELA where .... Testa aí e vê se funciona.
  18. Bom dia Diego, rs... De nada!! :.)
  19. Boa tarde Diego, Dá uma olhada neste script: recupera as pessoas que possuem cadastro em cursos duplicados. SELECT * from PES where CODPES in (select CODPES from CURS group by NOMECURS,CODPES having count (NOMECURS)>1)
  20. Bom dia Diego, Não entendi direito. SELECT * FROM PES, SERV , CURS WHERE PES.CODPES = SERV.CODPES AND SITUACAOPES = 1 AND PES.CODPES = CURS.CODPES AND CURS.NOMECURS IN (select NOMECURS from CURS group by NOMECURS having count (NOMECURS)>1) Esse select deve ter te retornado as pessoas que estão cadastradas em mais de um curso, sendo estes cursos duplicados pelo nome, ok? Por causa do "having count >1", apenas aparecerá os cursos duplicados. você quer agora todos os cursos com o nome duplicado? Caso seja isso, execute somente o subselect: select NOMECURS from CURS group by NOMECURS having count (NOMECURS)>1
  21. Bom dia Daniel, http://msdn.microsoft.com/pt-br/library/ms143219.aspx
  22. fulvio

    Ajuda em modelagem

    Bom dia Osvald, Prefiro a 1ª opção. Motivo: - 1ª opção: - a instrução "select count(chave) from tabela" é muito rápida (milisegundos). Mesmo com tabelas com grande volume de dados (trabalho com tabelas com mais de 6 milhões de registros). - A periodicidade da requisição do Saldo Atual não será cotidiana. Mesmo que fosse, não impactará a performance. - Não necessitará de nenhum controle para identificar a quantidade de mensagens. - 2ª opção: - terá que criar uma tabela apenas para armazenar o valor total. - terá que realizar uma implementação para ficar incrementando o contador. As manipulações entre as duas tabelas terão que ser realizadas dentro de uma única transação. - Custo/benefício de implementação não viável. Terá que se preocupar com implementação onde o Sql já possui a funcionalidade (mesma coisa de criar uma função de contagem de caracter, ao invés de utilizar a função do Sql). Volume de Dados. Dica: A tabela onde conterá as mensagens terá 5k mensagens/dia. Faça um teste no sistema: - Inserção de quantidade significativa de dados na tabela. - Potencial de processamento por parte do servidor. Principais: Quantidade total de dados necessários na tabela de mensagens. - Data para expurgo dos dados. Será necessário realmente TODAS as informações na tabela principal? Já pense no expurgo dos dados. Mesmo com os dados expurgados (quer dizer, em outra tabela), pode-se ter acesso aos mesmos. Espero ter ajudado. :.)
  23. http://msdn.microsoft.com/pt-br/library/ms186865.aspx
  24. Como não tenho uma base com dados de exemplo, fica mais dificil de testar os selects... mas aos poucos vamos chegando... rs. Pelo que vi, o contador deve ser no resultado. Não gostaria de utilizar o UNION, mas dê uma olhada se assim funciona. Tive que utilizar o UNION por causa da coluna "s.codigo". Por este motivo, aparecerão NULL´s no codigo onde for realizado a soma. Caso você retire a coluna "s.codigo", não será necessário o UNION. Retornando este resultado, fica bem tranquilo de tratar as informações... :.) select s.servico, s.codigo, NULL SOMA from servicos s where s.codigo in (select it.grupo from itensorcamento it, orcamentos o where o.numero = it.codigoref and it.grupo=s.codigo) UNION select s.servico, NULL, count(s.servico) SOMA from servicos s where s.codigo in (select it.grupo from itensorcamento it, orcamentos o where o.numero = it.codigoref and it.grupo=s.codigo) group by s.servico
  25. Boa tarde Micheli, Bem acho que entendi... rs. Criei as temporárias e alterei os dados de inserção. Caso o relacionamento não seja este, poste um exemplo por favor. Fiz o select de acordo com os dados das tabelas temporárias. Faça as adaptações e olhe se é isto que deseja. -- Criação create table #Servicos (servico varchar(20), codigo int) create table #itensorcamento (grupo int, codigoref int) create table #orcamentos (numero int) -- Inserção de dados insert into #Servicos (servico, codigo) values ('Emplacamento',100) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #orcamentos (numero) values (500) select s.servico, s.codigo from #servicos s where s.codigo in (select it.grupo from #itensorcamento it, #orcamentos o where o.numero = it.codigoref and it.grupo=s.codigo)
×
×
  • Criar Novo...