none
dúvida sobre procedures em geral e chaves primarias RRS feed

  • Pergunta

  •  

    Olá galera trabalho com firebird a alguns anos e agora estou estudando SQL Server por necessidade. A princípio o que está pegando são as stored procedures, tanto que achei mais difícil de tratar as sintaxes do que no firebird.

    Por exemplo:

    Se eu tivesse uma tabela NUMERO com os seguintes campos id (int) e valor (numeric). eu criaria uma procedure que me retornasse as mesmas informações da tabela, porém tendo o campo valor multiplicado por 2... o corpo da procedure (procedure_multiplica) no firebird, eu faria um
    for select id, valor from NUMERO INTO : parametro_output_id, : parametro_output_valor do
    begin
    parametro_output_valor = : parametro_output_valor * 2;
    suspend;
    end

    na pequena rotina eu faria um select para cada registro dentro de um FOR, que já irá me preencher os 2 parametros output, ainda dentro do FOR, eu iria fazer a multiplicação e executaria o suspend, que iria gravar aquela execução, como se fosse um row novo para cada registro do FOR SELECT. Logo, se eu fizer select * from procedure_multiplica;
    ele iria me trazer os 2 outputs com o id e o campo valor multiplicado por 2....
    Pelo que eu entendi no sql server, brevemente falando eu teria que declarar uma tabela virtual, criar um cursor que iria varrer um select (como o FOR no firebird), dar um insert de cada registro do cursor na tabela virtual e finalmente retornar com um select na tabela virtual? complicado ao meu ver não?

    Outro detalhe, chaves primárias:

    Um exemplo bem simples, eu tenho uma tabela de USUARIO que tem id_usuario (int) e nome (varchar), outra tabela chamada META que tem id_meta (int), descricao (varchar) e meta(numeric).

    Posteriormente eu criaria uma tabela chamado USUARIO_META, criando os campos id_usuario e id_meta, apenas que seria a associação das duas tabelas para eventuais operações. No firebird, caso eu nao quisesse que essas informações fossem unicas, eu criaria 2 chaves primarias, e no sql server?!?

    Gostaria de ajuda a respeito disso pois é de grande interesse aprender hehehe
    Abraço Galera!
    quarta-feira, 13 de fevereiro de 2008 13:45

Respostas

  • Bom Dia Wendell

     

    Primeiramente bem vindo ao fórum. Tentaremos responder às suas dúvidas à medida do possível.

     

    Referente a sua dúvida com a SP, sua sugestão de utilizar um CURSOR é válida, mas talvez não seja o melhor caminho. Se a idéia é simplesmente retornar um SELECT com um campo multiplicado por 2, você poderia prosseguir da seguinte forma:

     

    Code Snippet

    CREATE PROCEDURE uspTeste

    AS

    select id, valor * 2 FROM Tabela

    GO

     

     

    O Firebird possui alguns recursos interessantes que ainda não estão disponíveis no SQL Server (SELECT com FROM em SP é um exemplo destes) mas nem por isso o TSQL é "complexo". Apenas uma questão de se acostumar com a sintaxe.

     

    O exemplo que você citou envolvendo a tabela associativa (usuario_meta) é praticamente universal e não é diferente no SQL Server. Na verdade você não cria "duas chaves primárias" (uma tabela só pode ter uma chave primária). O que você cria é uma chave primária composta por dois campos. Você poderá fazer isso através do comando ALTER TABLE. Ex:

     

    Code Snippet

    ALTER TABLE USUARIO_META

    ADD CONSTRAINT PK_USUARIO_META PRIMARY KEY (id_usuario, id_meta)

     

    ALTER TABLE USUARIO_META

    ADD CONSTRAINT FK_USUARIO_META_USUARIO FOREIGN KEY (id_usuario) REFERENCES usuario

     

    ALTER TABLE META

    ADD CONSTRAINT FK_USUARIO_META_META FOREIGN KEY (id_meta) REFERENCES meta

    , id_meta)

     

    [ ]s,

     

    Gustavo

     

    PS: Eu ia responder sua dúvida no Orkut, mas infelizmente no meu trabalho eu não possuo acesso.

    quarta-feira, 13 de fevereiro de 2008 14:03

Todas as Respostas

  • Bom Dia Wendell

     

    Primeiramente bem vindo ao fórum. Tentaremos responder às suas dúvidas à medida do possível.

     

    Referente a sua dúvida com a SP, sua sugestão de utilizar um CURSOR é válida, mas talvez não seja o melhor caminho. Se a idéia é simplesmente retornar um SELECT com um campo multiplicado por 2, você poderia prosseguir da seguinte forma:

     

    Code Snippet

    CREATE PROCEDURE uspTeste

    AS

    select id, valor * 2 FROM Tabela

    GO

     

     

    O Firebird possui alguns recursos interessantes que ainda não estão disponíveis no SQL Server (SELECT com FROM em SP é um exemplo destes) mas nem por isso o TSQL é "complexo". Apenas uma questão de se acostumar com a sintaxe.

     

    O exemplo que você citou envolvendo a tabela associativa (usuario_meta) é praticamente universal e não é diferente no SQL Server. Na verdade você não cria "duas chaves primárias" (uma tabela só pode ter uma chave primária). O que você cria é uma chave primária composta por dois campos. Você poderá fazer isso através do comando ALTER TABLE. Ex:

     

    Code Snippet

    ALTER TABLE USUARIO_META

    ADD CONSTRAINT PK_USUARIO_META PRIMARY KEY (id_usuario, id_meta)

     

    ALTER TABLE USUARIO_META

    ADD CONSTRAINT FK_USUARIO_META_USUARIO FOREIGN KEY (id_usuario) REFERENCES usuario

     

    ALTER TABLE META

    ADD CONSTRAINT FK_USUARIO_META_META FOREIGN KEY (id_meta) REFERENCES meta

    , id_meta)

     

    [ ]s,

     

    Gustavo

     

    PS: Eu ia responder sua dúvida no Orkut, mas infelizmente no meu trabalho eu não possuo acesso.

    quarta-feira, 13 de fevereiro de 2008 14:03
  • Gustavo, desde já muito obrigado pela sua resposta. Então, eu realmente postei em 3 lugares, inclusive no Orkut, mas acredito que este forum seja o mais aconselhavel, não? hehe...

    Eu já imaginava que na primeira resposta você iria tratar meu código dessa maneira, quis dar apenas um exemplo simples, mas voce tem razão, posso executar os calculos no próprio select, porém podemos nos deparar com situações de calculos complexos ou calculos que precisam de várias verificações para serem executados entre elas parâmetros e coisas mais, mas o fato de você confirmar a necessidade de criar um cursor, já me da uma luz de como se trabalhar com essas procedures no SQL Server, outro detalhe, eu tenho que criar uma tabela virtual e dar inserts nela, e posteriormente dar um select nela né? Quanto a complexidade, é vero, vou ter que me acostumar muuuito ainda, hehe.

    Eu instalei o express no meu micro, e comecei a criar tabelas pelo Manager Studio, como não consegui criar as chaves compostas pelo "wizard", deduzí que não era possível, também tinha lido no blog do sqlAuthority, de Pinal Daves, uma observação sobre apenas UMA chave, posso ter compreendido errado, e acabei nem tentando escrever o código no braço. A propósito, uma ferramenta como o próprio ibExpert ou o QuickDesk (mais inferior), são incomparáveis com o Manager Studio, para se trabalhar, existe uma outra ferramenta que seja mais intuitíva que o Manager Studio?

    Resumindo, as minhas duas dúvidas se resolveram, mas levantarei outra pergunta:

    Como você afirmou que não há possibilidade de dar selects em procedures e eu já deduzo que não consigo dar LEFT JOINS nas procedures, como disponível no firebird, como eu poderia estar contornando isso? Se você souber referências de leitura que possam me ajudar nesses tipos de dúvidas sobre T-SQL, porque eu consegui assimilar essas informações em um artigo que você publicou na plugmasters, mas nada afundo, não está fácil achar material, já dei uma boa fuçada, baixei os videos do próprio site do microsoft learning, mas é tudo muito basicão e na real eu preciso traduzir minhas necessidades do firebird pro Sql Server Smile

    Abraço!
    quarta-feira, 13 de fevereiro de 2008 17:47
  • Olá Wendell,

     

    Em muitas situações de cálculos complexos realmente temos de aderir a utilização de cursores e nesse caso, o firebird pode superar o TSQL em virtude de algumas operações. No entanto, o TSQL possui diversas maneiras de superar a utilização de cursores (mesmo para cálculos complexos) e talvez você não precise recorrer a eles.

     

    Infelizmente uma das limitações do TSQL é o fato de instruções SELECT poderem ser realizadas apenas contra Views e Functions e não contra procedures. Isso é realmente uma pena, pois, esse recurso ajuda muito em determinadas situações (tenho certeza de que essa deve ser uma funcionalidade bem requisitada na Wish List do SQL Server. Quem sabe na versão 201X teremos esse recurso). Se você precisar fazer algo do tipo, terá que criar uma tabela temporária e inserir o código da SP para posteriormente fazer o JOIN.

     

    Você poderá criar chaves primárias compostas pelo SQL Management Studio bastando clicar sobre a tabela com o botão direito, ir em Design, selecionar os campos com o botão direito e clicar sobre Set Primary Key. Com dois campos selecionados, a chave será composta. Não tive contato com essas ferramentas que você citou e também não conheço uma ferramenta alternativa boa em relação ao SQL Management Studio. Concordo que alguns pontos ele ficou devendo em relação ao Enterprise Manager, mas no geral é fácil de usar e superou o EM em diversos outros pontos.

     

    Ainda não encontrei um livro que falasse de TSQL em profundidade (e só falasse de TSQL), mas a SQL Server Central costuma vender alguns Ebooks (U$ 10,00) que costumam explorar o TSQL bem. Duas referências avançadas que li foi o TSQL Querying e o TSQL Programming da série Inside SQL Server 2005. Fico grato pela referência no Plugmasters. Recentemente postei um artigo envolvendo TSQL que você pode achar bem interessante.

     

    Mencionei o Orkut porque vi sua dúvida lá. Eu sou o moderador da comunidade. No entanto, o MSDN está com muito mais profissionais capacitados e a velocidade e qualidade da resposta superam o Orkut com certeza.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 13 de fevereiro de 2008 19:09