Ir para conteúdo
Fórum Script Brasil

fulvio

Moderadores
  • Total de itens

    1.218
  • Registro em

  • Última visita

Tudo que fulvio postou

  1. Pra fazer o UNION, a obrigatoriedade deverá ser nos campos de resultado. Nas cláusulas FROM e WHERE você pode referenciar / relacionar quaisquer tabelas. você pode pesquisar na mesma tabela sim. São duas execuções distintas, apenas unidas. Ex.: Select nome, data_de_nascimento, cpf from XXXXX..... UNION Select nome, data_de_nascimento, cpf from YYYYYY..... Qualquer dúvida, posta ai... :.) Se tiver dificuldade, posta alguns dados e faço um exemplo.
  2. Bom dia Amigo. Ok. A lógica fica a mesma, mas você terá q utilizar a função "charindex" para encontrar o marcador ":". Fiz um exemplo como o lá de cima. Pra entender, coloquei comentários no q cada sintaxe faz. Copia, cola e roda no SQL, beleza? Qualquer dúvida, posta aí... create table #tmp (Dados varchar(100), Data varchar(100)) insert into #tmp (Dados) values ('Ligação Local : 20/10/2009 - 20/10/2009') insert into #tmp (Dados) values ('DDI : 22/10/2009 - 22/10/2009') insert into #tmp (Dados) values ('DDD AM') insert into #tmp (Dados) values ('Ligação VIVO : 15/12/2009') select * from #tmp -- Sintaxe ltrim --> retirar espaços em branco na esquerda -- Se quiser retirar espaços em branco na direita, rtrim -- Sintaxe charindex --> encontra a posição do ":" na string. Se tiver dois ":", a função retorna a posição -- do primeiro ":" q encontrar. update #tmp set data=ltrim((substring(dados, (charindex (':', Dados) + 1), 100))) -- Caso o SQL não encontre o ":", ele retorna zero na posição. Sendo assim, ele copia todos os dados -- da coluna Dados para a coluna Data. Caso as duas sejam iguais, eu updato nulo. update #tmp set Data=null where Dados=Data select * from #tmp
  3. Boa tarde Amigo, você pode utilizar a funcionalidade UNION.
  4. Bom dia Amigo. Estava viajando e não deu pra responder antes... :.) Uma dúvida: estes dados já se encontram no SQL? Se já estiverem na Base, pode-se utilizar a função substring para dividir os dados. Como você falou q os dados seguem um certo padrão, fica mais fácil a implementação. Segue abaixo um exemplo com as informações q você postou. Espero q ajude!! Se não for isso, posta ai!! :.) create table #tmp (Dados varchar(100), Data varchar(100)) insert into #tmp (Dados) values ('Serviço : Data inicial a Data final') insert into #tmp (Dados) values ('Serviço') insert into #tmp (Dados) values ('Serviço : Data inicial a Data final') insert into #tmp (Dados) values ('Serviço : Data inicial a Data final') insert into #tmp (Dados) values ('Serviço : Data inicial a Data final') insert into #tmp (Dados) values ('Serviço : Data inicial a Data final') insert into #tmp (Dados) values ('Serviço') insert into #tmp (Dados) values ('Serviço') select * from #tmp update #tmp set data=(substring(dados, 11, 100)) select * from #tmp Mas se você quiser utilizar o delimitador ":", você terá q o encontrar na string (a função charindex retorna a posição em q o caracter procurado está na string). A partir dai, pega esta posição e utiliza o substring...
  5. Bom dia Thiago. Na sua idéia inicial, "Pensei em tirar o identity e usar um "select Max + 1" no momento de inserir num novo cadastro", dá para implementar sim!!! O problema é igual você falou: se tiver mais de um usuário simultaneamente, o aplicativo poderá pegar dados iguais. Uma solução para que isso não ocorra: você criará uma PROCEDURE no SQL, fazendo o "select Max + 1" --> a procedure não executa simultaneamente. Sendo assim, mesmo tendo usuários simultâneos, a procedure executará uma de cada vez. As demais execuções serão enfileiradas. você terá que criar uma tabela de controle, onde toda vez q realizar a chamada da procedure, você incrementa o valor do dado nesta tabela de controle (este incremento deverá ser implementado na procedure também). Retire o identity da tabela e coloque um índice único, com o(s) campo(s) q compunham o identity (isso para garantir a unicidade dos dados). Espero ter ajudado..... :.) Qualquer dúvida, posta ai!!!
  6. Bom dia Amigo. Não existe nenhuma função em SQL q faça isso. você terá q criar a sua. Fiz um exemplo logo abaixo. Dá uma olhada aí e vê se resolve o problema. Se for isso, cria a função!!! :.) declare @Contador as int declare @Numeros as varchar (100) declare @Valor as varchar Set @Contador = 1 Set @Numeros = '' Set @Valor = (substring ('A12vb45', @Contador, 1)) While (len('A12vb45') >= @Contador) Begin if isnumeric(@Valor) = 1 Set @Numeros = (@Numeros + @Valor) Set @Contador = @Contador + 1 Set @Valor = (substring ('A12vb45', @Contador, 1)) End select @Numeros
  7. Bom dia Amigo. Tem como fazer as implementações que precisa. Vai depender qual a versão do SQL: 2000 - DTS; 2005 - SSIS. Postei uma resposta a pouco tempo sobre este assunto. Para fazer as transformações nos dados do TXT, o interessante seria importar tudo pro SQL e lá realizar as alterações. Abaixo tem um link com um exemplo que postei em outro post. Dê uma pesquisada aí... :.) http://docs.google.com/View?docID=0ATvXwxK...atest&hgd=1 Achei o link no fórum: http://scriptbrasil.com.br/forum/index.php?showtopic=143994
  8. fulvio

    Update campo

    Bom dia Amigo. Não precisa fazer while não. É bem mais fácil que se parece.... :.) update Tabela 1 set Telefone=T2.Telefone from Tabela 1 T1, Tabela 2 T2 where T1.ID=T2.ID
  9. Boa tarde Felipe, Utilize a função convert. Ex.: select convert (datetime, '11-05-1980', 102) O número 102 é um dos formatos. No F1 do SQL possui algumas formas de conversão de datas. Procure por "convert". Uma dica: cuidado com a forma em que passará os dados para o SQL e vice-versa. Dependendo da sua configuração, ele pode identificar os dados como sendo "DD-MM" ou "MM-DD". Faz os testes ai.... :.)
  10. fulvio

    Consulta

    você pode utilizar a sintaxe *= ou =* - especificação Ansi 92. Mas a partir do SQL2005, estas implementações estão descontinuadas. O melhor mesmo é utilizar a sintaxe "left outer join" ou "right outer join" (que é a mesma coisa do *= ou =*). Como ficaria o select: select nome_cliente, dt_pedito from cliente left join pedido on codcli = cod_cliente Testa no seu select também a sintaxe *= ou =*.... ;.)
  11. fulvio

    REplace

    Se der, posta a estrutura da coluna q está manipulando com alguns dados pra mim. O problema de suprimir os zeros a esquerda é quando o SQL o identifica como inteiro. Desta forma, os zeros a esquerda são eliminados. O q pode-se fazer, é forçar o SQL a identificar as informações como caracteres. No exemplo abaixo não precisaria fazer a conversão e não ocorre o problema, mas ficaria desta forma: declare @teste varchar(20) set @teste = 'X000000123' select replace (@teste, 'X', 44) select replace (convert (varchar,@teste), 'X', 44)
  12. beleza... como não tinha os dados, fiz meio "as escuras"... rs. Não deu pra testar. Depois q entendeu, sai fácil!!! :.) Precisando é só postar. Até mais.
  13. fulvio

    REplace

    Bom dia Flávio, Tenho alguns livros mas são mais teóricos. Quando preciso de alguma função ou sintaxe, é na net mesmo q encontro... rs. Tem muita coisa boa. Tenho um guia prático de UML. você encontra pra SQL também...
  14. Bom dia Amigo. Creio q você conseguirá fazer com sub-selects. Coloquei um "alias" pra tabela tb_partida_detalhes, pois terá q referenciá-la novamente. Faz os testes ai e se não ser certo, posta alguns dados da tabela... :.) query: select tb_partida_detalhes_time_nome as NomeTime, sum(tb_pontos_pontos)as Pontos, sum(tb_partida_detalhes_gols)as TotalGol, count(tb_partida_detalhes_pontos_cd) as Total, (select count(vitoria) from tb_partida_detalhes t where t.tb_partida_detalhes_pontos_cd=1 and t.tb_partida_detalhes_pontos_cd=pd.tb_partida_detalhes_pontos_cd ) as Vitoria, .... from tb_partida_detalhes pd, tb_pontos where tb_partida_detalhes_pontos_cd= tb_pontos_cd group by tb_partida_detalhes_time_nome order by sum(tb_pontos_pontos)desc
  15. fulvio

    Unir uns campos

    Boa tarde Amigo, Baseado no exemplo q postou, criei uma rotina pra concatenar as informações de telefone. Neste exemplo, declarei algumas variáveis aleatórias. você terá q adaptdar à sua base. Ao invés de declarar ponteiros, criei colunas pra controlar o processo. Inseri alguns comentários pra ficar mais fácil entender. Espero q ajude. Vai rodando passo a passo. Não tem como você concatenar as informações sem utilizar tabela auxiliar... Qualquer dúvida q tiver, posta ai!!! -- criação da tabela create table dbo.Dados (Nome varchar(80), telefone int) -- inserção dos dados insert into Dados (nome, telefone) values ('Ana', 923424) insert into Dados (nome, telefone) values ('Ana' ,2342342) insert into Dados (nome, telefone) values ('Pedro' , 542342) insert into Dados (nome, telefone) values ('Pedro' , 342424) insert into Dados (nome, telefone) values ('andre' , 4234234) -- verificação select * from Dados -- criação de temporária em instância. create table #tmp (nome varchar(80), telefones varchar(80), controlador tinyint) -- criação de temporária que conterá os telefones da pessoa create table #telefones (telefones varchar(80), controlador tinyint) -- inserção dos dados distintos na temporária. insert into #tmp (nome) select distinct nome from Dados -- verificação select * from #tmp -- declaração de variável. Selecione tudo para baixo e rode até onde está os ********* Declare @Pessoa as varchar(80) Declare @TelefoneConcatenado as varchar(100) Declare @Telefone as varchar(15) Set @Pessoa = (select top 1 nome from #tmp where controlador is null) -- loop para cada pessoa existente na tabela #tmp. while @Pessoa is not null Begin truncate table #telefones -- inserção dos telefones na tabela temporária #telefones, para fazer a concatenação das informações. insert into #telefones (telefones) select telefone from dados where nome=@Pessoa -- atribuindo valor set @Telefone = (select top 1 telefones from #telefones where controlador is null) -- loop para concatenar os telefones. While @Telefone is not null Begin if @TelefoneConcatenado is null Set @TelefoneConcatenado = @Telefone Else Set @TelefoneConcatenado = @TelefoneConcatenado + ', ' + @Telefone update #telefones set controlador=1 where telefones=@Telefone set @Telefone = (select top 1 telefones from #telefones where controlador is null) End -- gravação dos telefones concatenados na tabela #tmp update #tmp set telefones=@TelefoneConcatenado where nome=@Pessoa Set @TelefoneConcatenado = null -- alterando a pessoa update #tmp set controlador=1 where nome=@Pessoa Set @Pessoa = (select top 1 nome from #tmp where controlador is null) End -- até aqui. ********* -- verificação select * from Dados select * from #tmp
  16. Bom dia Marcelo, você pode pegar a parte do código que cria as tabelas e criar uma procedure. Aí você chama esta procedure em seu script. No exemplo que passou, vi que as tabelas não são temporárias (e sim auxiliares), pois não possuem @ ou #. Se você criar tabelas temporárias com @, o processo não funcionará. Aconselho a criar procedure... - Vai um exemplo ai: create proc CriaTabelas as create table dbo.TesteTabela (valor int) -- roda primeiro select * from TesteTabela -- chama a procedure e roda o select depois exec CriaTabelas select * from TesteTabela
  17. fulvio

    REplace

    Função replace do SQL: select 'X456897863' select replace('X456897863', 'x', '45862') update cliente set cod=replace(cod, 'x', '45862') OBS.: verifique qual o "Collation" q está sendo utilizado na BD. Dependendo do collation, as letras C, c, Ç, c serão identificadas como diferentes ou não. O mesmo caso será para a letra x ou X... :.)
  18. beleza... Então vamos voltar pro exemplo q me passou.... Diz algumas alterações e comentários. CREATE TABLE dbo.aluno(DT_REL DATEtime,DT_REL_ANT DATEtime) Insert into aluno(DT_REL, DT_REL_ANT) Values('2008-02-01','2008-05-04') Insert into aluno(DT_REL, DT_REL_ANT) Values('2008-02-01','2008-05-04') CREATE TABLE dbo.ANALISE(MES int) --------------- apenas para analisar os dados------- Select * from aluno Select * from analise DROP TABLE aluno DROP TABLE ANALISE ----------------------------------------------------- -- bom agora que criamos e populamos a tabela vamoas a dúvida. ---- Agora vamos ao que não esta funcionando .... DECLARE @DT_REL datetime, @MES_DT_REL varchar(10), @DT_REL_ANT datetime, @MES_DT_REL_ANT varchar(4), @base varchar (1000), @base2 varchar (1000), @Script varchar (1000) SET @base = 'analise' SET @base2 = 'aluno' --SET @MES_DT_REL = (select TOP 1 Month(DT_REL) as MES_DT_REL from @base2) -- assim não funciona, pois o sql espera o nome da tabela, e não uma variável set @Script = ('select TOP 1 Month(DT_REL) from ' + @base2) --set @MES_DT_REL = exec (@Script) -- assim também não funciona, pois não se consegue associar o comando de execução da string, pegando o resultado e atribuindo a uma variável -- você terá q criar uma temporária, jogar os dados do resultdo do EXEC na temporária e depois atribuir à variável. -- A temporária criada é em tempo de execução. Selecione todos os comandos e rode junto. declare @tmp table (mes int) insert into @tmp exec (@Script) set @MES_DT_REL = (select mes from @tmp) -- verifica o dado atribuido a variavel. select @MES_DT_REL -- Ai você faz pros outros casos............................... SET @DT_REL_ANT = (select DATEadd(Month, -1, DT_REL) as DT_REL_ANT from @base2) SET @MES_DT_REL_ANT = (select (Month(DT_REL))-1 as MES_DT_REL_ANT from Base2) Print @DT_REL Print @MES_DT_REL Print @DT_REL_ANT Print @MES_DT_REL_ANT set @Script = 'insert into ' + @base + ' (MES) Select top 10 Month(DT_REL) from ' + @base2 + '' select @Script exec (@Script)
  19. Bom dia Amigo. Segue um exemplo logo abaixo. você pode fazer de duas formas, sendo q a primeira é a mais usual. :.) -- Criação de tabela temporaria create table #Exemplo (TId int, num_card int, Data datetime, Taxa float) -- Inserção insert into #Exemplo values (34, 23,'2008-10-22', 3.4) insert into #Exemplo values (39, 23,'2009-09-23', 4.5) select * from #Exemplo select max(Data) from #Exemplo where num_card=23 select top 1 Data from #Exemplo where num_card=23 order by data desc
  20. Uma pergunta: você quer fazer todos os inserts ao mesmo tempo? Porque se for isso, não precisa delcarar as variváeis e setar o valor nelas. Fiz um novo script baseado no seu. Dá uma olhada: -- criei as tabelas. A tabela ANALISE coloquei uma coluna a mais CREATE TABLE dbo.aluno(DT_REL DATEtime,DT_REL_ANT DATEtime) Insert into aluno(DT_REL, DT_REL_ANT) Values('2008-02-01','2008-05-04') Insert into aluno(DT_REL, DT_REL_ANT) Values('2008-02-01','2008-05-04') CREATE TABLE ANALISE(MES int, MES_ANT int) -- verificação Select * from aluno Select * from analise --- Declaração de variavies Declare @base varchar (1000), @base2 varchar (1000), @Script varchar (1000) SET @base = 'analise' SET @base2 = 'aluno' -- Inserção de todos os meses, MES e MES ANTERIOR, baseado na tabela ALUNO. OBS.: o selecet está com TOP 10 set @Script = 'insert into ' + @base + ' (MES, MES_ANT) Select top 10 Month(DT_REL), Month(DT_REL_ANT) from ' + @base2 + '' select @Script exec (@Script) -- verificação dos dados. Select * from aluno Select * from analise Se não for isso, posta ai... :.)
  21. As delimitações do SQL são as padrões (|, TAB, etc). Pelo q entedi, você queria delimitar tipo: a 1ª coluna terá os 5 primeiros digitos, a 2ª coluna terá os 3 próximos digitos, etc. Se for isso (os campos possuem tamanho e preenchimentos fixos), você pode utilizar a função SUBSTRING do SQL. Ex: select 'AAA BBB CCC' select substring('AAA BBB CCC', 1, 3) select substring('AAA BBB CCC', 5, 3) select substring('AAA BBB CCC', 9, 3) você pode colocar estas instruçõe no objeto "Script de Alterações", na imagem q postei acima. Se não for isso, posta ai.... :.) Ah... outra coisa. você pode alterar os valores de resgate do string... só colocar, ao invés dos números fixos, variável. Esta variável pode ser setada diretamente da rotina ou lida da Base de Dados.. Ex: Declare @Numero int Set @Numero = 1 select 'AAA BBB CCC' select substring('AAA BBB CCC', @Numero, 3) select substring('AAA BBB CCC', 5, 3) select substring('AAA BBB CCC', 9, 3)
  22. Boa tarde Flávio, O script q postou não irá rodar, pois está com erro nas sintaxes. Ex.: @base = 'analise' (errado) SET @base = 'analise' (certo) @MES_DT_REL = (select Month(dns) as MES_DT_REL from @base2) (errado) SET @MES_DT_REL = (select TOP 1 Month(dns) as MES_DT_REL from @base2) (certo) (a variável só pode receber 1 valor) A variável @Script não está declarada. Dá uma olhada no q passei pra você e faz as adaptações...
  23. Bom dia Flávio, Segue o script com as alterações. Coloca no Query Analyzer e vai rodando passo a passo pra entender. Se tiver alguma dúvida, posta aí... ---- Vamos criar as tabelas e as informações da minha dúvida. CREATE TABLE dbo.aluno(DT_REL DATEtime,DT_REL_ANT DATEtime) Insert into aluno(DT_REL, DT_REL_ANT) Values('2008-02-01','2008-05-04') Insert into aluno(DT_REL, DT_REL_ANT) Values('2008-02-01','2008-05-04') CREATE TABLE dbo.ANALISE(MES int) --------------- apenas para analisar os dados------- Select * from aluno Select * from analise --DROP TABLE aluno --DROP TABLE ANALISE ----------------------------------------------------- -- bom agora que criamos e populamos a tabela vamos a dúvida. ---- Agora vamos ao que não esta funcionando .... -- alterei os tipos das variáveis DECLARE @DT_REL datetime, @MES_DT_REL varchar(2), @DT_REL_ANT datetime, @MES_DT_REL_ANT varchar(2), -- como você declarou uma variável, você só poderá atribuir 1 valor à variável.... Por isso q coloquei top 1 set @DT_REL = (select top 1 DT_REL from aluno) set @MES_DT_REL = (select top 1 Month(DT_REL) from aluno) set @DT_REL_ANT = (select top 1 DATEadd(Month, -1, DT_REL) from aluno) set @MES_DT_REL_ANT = (select top 1 (Month(DT_REL))-1 from aluno) -- o Print agora vai sair ok. Print @DT_REL Print @MES_DT_REL Print @DT_REL_ANT Print @MES_DT_REL_ANT --- Eu preciso dar un insert into com o mes na tabela analise, porém, --- a premissa é resultado do parametro para incluir na tabela --- eis abaixo uma parte do que preciso realizar -- Assim não funciona Insert into @base(mes) values (MES_DT_REL) Select top 10 @MES_DT_REL from @base -- você quer referenciar a tabela dinamicamente: passar o nome da tabela pela variável -- e acessa-la. Desta forma, o SQL não entende que dentro da variável contém o nome da tabela q pretende -- acessar. Ele espera o nome de uma tabela, não uma variável. -- Se você quiser fazer a inserção de todos os dados, você não precisará da criação de variáveis pra isso. -- Vou dar um exemplo abaixo utilizando a tabela q passou de exemplo. -- passei a declaração de variavel pra cá. declare @base varchar (1000) set @base = 'analise' -- você tem q montar o script se quiser passar o nome da tabela dinamicamente. Declare @Script varchar(100) set @Script = 'insert into ' + @base + ' (MES) Select top 10 Month(DT_REL) from aluno' -- Select pra saber como o script ficou. select @Script -- A inserção não será realizada de 1 registro, mas sim de todos os registros. Desta -- forma, não será necessário utilizar as variáveis declaradas no começo do script. -- Executa o script montado na variável. exec (@Script) -- Verifica os dados gravados. select * from analise
  24. Bom dia Flávio, Se o sequencial dos dados tiverem um delimitador, você conseguirá colocar os dados em colunas distintas, tipo: 252 | AAA | BBB | SSS | DDD | 555 | 666 | 888 O exemplo que me passou, o delimitador é apenas 1 espaço. Se na sua estrutura tiver o TAB como delimitador, você conseguirá também... :.) Pois bem... com este exemplo que me passou, criei uma tabela contendo 1 coluna (por causa da falta do delimitador) e realizei a inserção dos dados. Com isso, fica bem mais fácil você manipular os dados no BD (excluir os dados desnecessários, separar campos, etc). Segue o link do print das telas. você salva a DTS e depois agenda pra rodar a hora que precisar. A transformação você fará uma vez via Query Analyzer, depois incorpora na DTS. Coloquei alguns textos explicando. Espero q ajude... http://docs.google.com/Doc?docid=0ATvXwxKT...cQ&hl=pt_BR
  25. Bom dia Flávio, você terá q criar uma DTS também. Não conheço comandos SQL que realizem esta tarefa, mas provavelmente você conseguirá manipular os arquivos utilizando o "Visual Basic ActiveX Script". Dê uma pesquisada na web pra conseguir algum material a respeito.
×
×
  • Criar Novo...