Ir para conteúdo
Fórum Script Brasil

fulvio

Moderadores
  • Total de itens

    1.218
  • Registro em

  • Última visita

Tudo que fulvio postou

  1. Não dá pra salvar em TXT ou XLS utilizando um simples select. você terá que criar um SSIS para exportar os dados que necessita.
  2. Qual versão do SQL utiliza? Se for o 2000, pode-se fazer uma DTS para exportar os dados pro formato que quiser. Se for 2005, utiliza-se o SSIS. Aí vai ser um pouco diferente da conversão para o formato XML.
  3. Bom dia Amigo, Ok. Como você executou três comandos, pensava que o problema não estava no nivel de compatibilidade, mas sim de acesso pelo usuário. Dá uma lida no link abaixo. É um pouco grande, mas vale a pena... rs. http://msdn.microsoft.com/pt-br/library/bb510680.aspx
  4. Ele não salva o XML em um arquivo. Ele transforma o resultado que vem em linhas/colunas em formato XML. Aí você manipula da forma que precisar.
  5. Boa tarde Amigo, Calma.... rs. O SQL comporta sim. Na verdade, o XML é nativo. Você pode não somente fazer, mas também ler arquivos XML pelo SQL. Faça seu select normalmente. No final escreva "for xml auto". E só. Ex.: select * from Tabela where ..... for xml auto
  6. Bom dia Amigo, você está tendo problemas com o Diagrama do SQL? Tente rodar: use banco go exec sp_changedbowner 'sa' go
  7. Boa tarde Diego, Ai você pode pegar o mesmo script e alterar somente o max(XXXX). No script q passei: select si.matricula, max(si.referencia), si.padrão from #SITUACAO si where si.referencia <> (select referencia from #SERVIDOR where matricula=si.matricula) group by si.matricula, si.padrão você pode trocar a variável max da referencia pelo que precisar. No seu caso, se quiser pegar o ultimo, pegue o max da data de inserção (se tiver). Ai coloque o campo no group by também...
  8. Boa tarde Diego, Dá uma olhada se é isto que está precisando. Criei as temporárias e comentei: -- Criação temporária create table #SITUACAO (Matricula int, Referencia int, padrão int) -- Carga insert into #SITUACAO values(167, NULL, NULL) insert into #SITUACAO values(167, NULL, NULL) insert into #SITUACAO values(167, 19, 21) insert into #SITUACAO values(167, 21, 21) -- Criação temporária create table #SERVIDOR (Matricula int, Referencia int, padrão int) -- Carga insert into #SERVIDOR values(167, 21, 21) -- Verificação select * from #SITUACAO select * from #SERVIDOR -- Script select si.matricula, max(si.referencia), si.padrão from #SITUACAO si where si.referencia <> (select referencia from #SERVIDOR where matricula=si.matricula) group by si.matricula, si.padrão
  9. Bom dia Marcio, Se você quiser usar o código já criado na tabela principal, pode-se "updatar" os dados sem a necessidade de limpá-los. Mas se você quiser limpar os códigos e fazer novo, ai terá que fazer um loop. Coloquei dois exemplos logo abaixo, utilizando temporárias. Este é para "updatar" os campos, utilizando o próprio campo Codigo: create table #Tabela (Codigo int, dados char(3)) insert into #Tabela values (1, 'XXX') insert into #Tabela values (2, 'YYY') insert into #Tabela values (3, 'ZZZ') insert into #Tabela values (4, 'AAA') -- conferir dados select * from #Tabela update #Tabela set codigo = (codigo+100) -- conferir dados select * from #Tabela Este outro exemplo á para inserir novos códigos, onde a coluna Codigo se encontra com NULL: create table #Tabela (Codigo int, dados char(3)) insert into #Tabela (dados) values ('XXX') insert into #Tabela (dados) values ('YYY') insert into #Tabela (dados) values ('ZZZ') insert into #Tabela (dados) values ('AAA') -- conferir dados select * from #Tabela -- criar coluna para controle alter table #Tabela add Controle int identity -- conferir dados select * from #Tabela -- Fazer as inserções. Seleciona e roda até o END do loop Declare @Contador int Declare @Controle int Set @Contador = 100 Set @Controle = 1 While (select max(Controle) from #Tabela) >= @Controle Begin update #Tabela set codigo = @Contador where Controle=@Controle Set @Controle = @Controle + 1 Set @Contador = @Contador + 1 End -- conferir dados select * from #Tabela
  10. Parabéns aos dois novos estagiários!!! Sucesso.
  11. Boa tarde Flávio, O script retorna os dados ok no Query Analyzer (ou Management Studio) SQL? Não vi nenhum erro de sintaxa no script.
  12. Boa tarde Marcio, Os códigos são inteiros? Se forem, poderá somar 100 nos códigos antigos e gravá-los na nova tabela. Ex.: declare @Codigo int Set @Codigo = 2 select @Codigo + 100
  13. Boa tarde Marcio, Faltou o Exemplo.... :.)
  14. Bom dia Benzela, Dê uma olhada neste link. Aqui há várias informações. Em relação a sua dúvida, as explicações estão mais ou menos no meio do site. Espero que ajude: http://www.bufaloinfo.com.br/artigos/artigo21032009.asp
  15. Bom dia Amigo, É considerada sim uma boa prática. Não quer dizer que todas as tabelas terão. Vai depender da necessidade de cada regra. Apenas uma dica: se o identity for (1, 1), o (1, 1) pode ser suprimido. idTopico int identity(1,1) Pode ser escrito assim: idTopico int identity Outras particularidades do identity você pode ler aqui: http://msdn.microsoft.com/pt-br/library/ms186775.aspx
  16. Boa tarde Amigo, Quando a pessoa fizer uma pergunta, será realizada uma inserção na tabela tópico (idTopico). Para saber se existe alguma resposta, você pode pesquisar o idRespostas na tabela Respostas pelo idTopido. Como que seria esta pesquisa? Faça um "select count(idRespostas) from Respostas where idTopico=XXX". Se o resultado for 0, quer dizer que não existe nenhuma resposta. Se, por exemplo for 3, quer dizer q já existem 3 respostas. Aí você sabe que o próximo idRespostas será o count +1 (4). Ok?
  17. Boa tarde NIK, Estava pensando aqui.... se você insere dados diferentes nos Bancos de Teste e Produção, esta atualização não será possível... Como vai saber o dado X é realmente o dado Y, batendo as chaves que foram inseridas em bancos distintos? Nesta idéia de sql dinâmico, como utiliza o *, você não precisa referenciar todos os campos. Apenas a tabela nas duas bases devem estar iguais (quantidade de campos, ordem e tipo). Será inserida apenas as informações novas, que existam na base de Produção e não exista na base de Teste. No caso não será updade, mas insert.
  18. Boa tarde NIK, Conheço a empresa. Tenho vários colegas que trabalham ai. Agora é TOTVS.... :.) Se forem muitas tabelas, seria interessante você utilizar a segunda opção (sql dinâmico). Para não dar problema de chaves, você terá q criar uma coluna apenas para identificar a cronologia das tabelas. Primeiro você terá que inserir nas mães, para depois inserir nas filhas. Caso fique muito lento, desative todas as contrants. Quando acabar, ative novamente (na mesma transação). Tenho dois processos grandes que rodam na empresa desta forma. Uma é expurgo de dados. Aí eu excluo da filhas e depois da mãe (o inverso do seu caso). O problema será se, por exemplo: Na Base Oficial houver uma inserção do Produto X, com PK=20 Na Base Teste houver uma inserção do Produto Y, com PK=20 Na atualização dos dados entre Produção e Teste, como cruzará PK´s, terá a PK=20 em Produção identificando o produto X e no Teste o produto Y. Pra resolver este problema, você terá que bater descrição. Será praticamente inviável... fora que as filhas ficarão com referências erradas.
  19. Boa tarde NIK, A base possui muitas tabelas? Ou seriam todas as tabelas a serem atualizadas? Pode-se implementar uma rotina em que os dados são lidos na Base Oficial e gravados apenas os dados inseridos recentemente na Base de Testes (através de Linked Server). Algo do tipo: insert into TabelaTeste select * from TabelaProducao where not exists (select * from TabelaTeste) Neste caso, se tiverem poucas tabelas, dá pra fazer na mão mesmo. Se tiver grande quantidade de tabelas, pode-se criar uma tabela na Base contendo os nomes de todas as tabelas que deseja atualizar (sysobjects). você fará um loop lendo nas linhas os nomes das tabelas e criando uma instrução de sql dinamicamente. Aí basta executá-la. Ex.: Declare @SQL varchar(50) Declare @NomeTabela varchar(50) Set @SQL = 'select * from ' + @NomeTabela + ' where not exists (select * from '+ @NomeTabela + ')' exec (@SQL) Se quiser inserir mais tabelas, basta colocar o nome dela na tabela de controle de Nomes de Tabelas. Não se altera o script.
  20. Tenta trocar o * pelo nome do campo LTS. O subselect está retornando a quantidade 3349 porque você está dando um select sem realizar o filtro nas informações. O 3349 são todas as inserções na coluna de referência. (SELECT COUNT (DISTINCT T01001_I_MATRICULA )as MATRICULAS FROM RH.T01135_LTS)AS MATRICULAS você terá que filtrar: (SELECT COUNT (DISTINCT T01001_I_MATRICULA )as MATRICULAS FROM RH.T01135_LTS where .... )AS MATRICULAS O problema é que a query pode ficar muuuito grande... :.(
  21. Bom dia Diego, Tente dar um count na quantidade de matriculas direto, sem utilizar subselect: SELECT U.T01004_S_SIGLA AS Secretaria ,COUNT (*) AS QUANTIDADE_LTS ,COUNT (T01001_I_MATRICULA) AS MATRICULAS FROM RH.T01135_LTS LTS LEFT JOIN RH.T01101_LAUDO LAUDO ON LAUDO.T01135_I_CDLTS = LTS.T01135_I_CDLTS AND LAUDO.T01135_I_ANO = LTS.T01135_I_ANO AND LAUDO.T01135_I_SEQUENCIA = LTS.T01135_I_SEQUENCIA AND LAUDO.T01135_I_TPDOC = LTS.T01135_I_TPDOC LEFT JOIN RH.T01260_REVISAOAPO APOS ON APOS.T01135_I_CDLTS = LTS.T01135_I_CDLTS AND APOS.T01135_I_ANO = LTS.T01135_I_ANO AND APOS.T01135_I_SEQUENCIA = LTS.T01135_I_SEQUENCIA AND APOS.T01135_I_TPDOC = LTS.T01135_I_TPDOC INNER JOIN RH.T01001_SERVIDOR S ON S.T01002_I_CDENT = LTS.T01002_I_CDENT AND S.T01001_I_MATRICULA = LTS.T01001_I_MATRICULA INNER JOIN RH.T01000_PESFISICA P ON P.T01000_I_CDPESFIS = S.T01000_I_CDPESFIS INNER JOIN RH.T01004_UNIDFUNC U ON U.T01002_I_CDENT = S.T01002_I_CDENT AND U.T01004_I_CDUNIDFUN = S.T01001_I_CDORGLOT AND U.T01004_I_VERSAO = S.T01001_I_VORGLOT LEFT JOIN RH.T01265_FUNCPERICIA PERITO ON PERITO.T01265_I_CDFUNCIONARIO = LTS.T01135_I_CDMEDPERITO LEFT JOIN RH.T01001_SERVIDOR SP ON SP.T01002_I_CDENT = PERITO.T01002_I_CDENT AND SP.T01001_I_MATRICULA = PERITO.T01001_I_MATRICULA LEFT JOIN RH.T01000_PESFISICA PP ON PP.T01000_I_CDPESFIS = SP.T01000_I_CDPESFIS GROUP BY U.T01004_S_SIGLA ORDER BY U.T01004_S_SIGLA
  22. Bom dia Xistyle, Não sei se entendi bem o problema.... você pode utilizar a função PIVOT do sql (a partir do SQL 2005). http://msdn.microsoft.com/pt-br/library/ms177410.aspx Dá uma olhada se é isso que precisa.
  23. Mauricio, Os dois updates estão filtrando apenas datas de 2010: ... AND CRDUSRAPP_VALENDDATE IN ('2010-12-19', '2010-12-20', '2010-12-21', '2010-12-30', '2010-12-31') Sendo assim, o 1º update retornará alguma alteração. O 2º update não terá nenhuma alteração, pois está filtrando datas apenas de 2010. O que você pode fazer: - Criar uma temporária com apenas as duas colunas (já filtrando os dados ...CD_ID = 3 and APP_ID = 900...) - "Updatar" todos os campos CRDUSRAPP_VALENDDATE utilizando o 1º update que postei. - "Updatar" apenas os campos CRDUSRAPP_VALENDDATE que possuem data de 2009 e 2010 para 2011 (neste update você não precisa referenciar o campo CRDUSRAPP_VALSTADATE. Utilize os dados do próprio campo CRDUSRAPP_VALENDDATE para alterar ele mesmo). - Depois de conferido as alterações, rode o script na tabela principal (não esquecendo de recolocar os filtros). Para ficar mais fácil o entendimento, criei uma tabela temporária e manipulei os dados nela. Copiei o script e faça os testes passo a passo: create table #Tabela (datainicio datetime, datafim datetime) insert into #Tabela (datainicio) values ('2008-10-03') insert into #Tabela (datainicio) values ('2008-05-01') insert into #Tabela (datainicio) values ('2009-04-23') insert into #Tabela (datainicio) values ('2009-01-23') insert into #Tabela (datainicio) values ('2010-01-15') insert into #Tabela (datainicio) values ('2010-02-10') -- Verifica as inserções select * from #Tabela -- Updata o campo datafim, levando em consideração o campo datainicio update #Tabela set datafim=(dateadd(year, 1, datainicio)) -- Verifica as alterações select * from #Tabela order by datafim -- Acrescenta 2 anos para datas de 2009. Perceba que não referencio mais o campo datainicio update #Tabela set datafim=(dateadd(year, 2, datafim)) where year(datafim)=2009 -- Acrescenta 1 ano para datas de 2010 update #Tabela set datafim=(dateadd(year, 1, datafim)) where year(datafim)=2010 -- Verifica as alterações select * from #Tabela order by datafim
  24. Depois de rodar o update para alterar a datafim acrescentando 1 ano (de acordo com a datainicio), alguns campos ficaram com data de 2009 e 2010? É isso? Agora você quer pegar as datas de 2009 e 2010 e colocar 2011? Se for isso, faça os testes com o script: -- Acrescenta 2 anos para datas de 2009 update NomeTabela set datafim=(dateadd(year, 2, datafim)) where year(datafim)=2009 -- Acrescenta 1 ano para datas de 2010 update NomeTabela set datafim=(dateadd(year, 1, datafim)) where year(datafim)=2010
  25. Tópico movido para Fórum Script Brasil > Banco de Dados > MySQL.
×
×
  • Criar Novo...