Sybase

Aí Galera,

Estou utilizando o SGBD Sybase no meu trabalho, só que estou com um problema, tenho uma stored em q crio tabelas, só que o nome da tabela vai ser o parametro que eu lhe passar, na stored.
Mas não sei pk está dando pau.

Exemplo:

CREATE PROCEDURE createTable1"(@nameTbl varchar(10))
as
BEGIN
create table @nameTbl(a integer)
END

Será que alguem me pode ajudar

//Graveyard

Acho que não dá para fazer assim (passar o nome da tabela desse jeito aí. )

Primeiramente, por que é que uma tabela tem de ter qualquer nome e ser criada por uma procedure ? Qualquer DBA que se preza iria arrancar SEUS cabelos - a menos que você seja careca, aí iria arrancar a sua pele mesmo - porque ele iria exigir que a tabela fosse criada POR ELE e via SCRIPT. (Você está fazendo isso para passar por cima do DBA? Não vai dar certo.)

Depois, acho que isso seja possível fazer sim, mas através de comandos SQL dinâmicos, que podem ser chamados em stored procedures (de novo, pode ser que você não tenha a permissão adequada - acho que a permissão para executar um comando SQL dinâmico em procedure deve ser outorgada pelo DBA, e como esses comandos abrem um buracão gigante de segurança, um DBA que se preze nunca iria dar essa permissão.).

Lol,

Com que então eu quero passar por cima do DBA não?
Nada disso cara, eu preciso de criar tabelas todos os meses, porque a aplicação importa ficheiros todos os meses, e o nome depende do ficheiro q seja importado, e do mês que seja importado.
Eu sei que posso fazer isso do lado do código da minha app, o problema é que estamos a falar de cerca de 1.000.000 de registos, e fazer do lado da app iria ficar mto lento.
Por isso é que eu queria criar a tabela na stored.
Criava a tabela, ia buscar os dados que queria, tratava-os e mandava os dados pra nova tabela.

Tem alguma solução melhor?

Atentamente
//Graveyard

Argh - isso quer dizer que seu banco de dados tem centenas de tabelas do tipo “tb_hist_cliente_2008_jan”, “tb_hist_cliente_2008_fev” etc?

De qualquer maneira, nada que o manual do Sybase não lhe ajude. Nesta página - procure o “Example 6”. Ele mostra como é que se executa qualquer comando do SQL que estiver dentro de uma string.

Antes de mais quero agradecer pela sua ajuda, vou testar, mas mesmo assim não me parece que funcione, porque o nome da tabela que eu crio vem por parametro, e se reparar no exemplo que você me deu o nome da tabela está definido, não vem como parâmetro.

Ah, o tipo de tabela é como você referiu no seu post, mas ainda tenho mais tipos:

“tb_hist_cliente_2008_jan”

“tb_hist_cliente_2008_fev”

“tb_x_cliente_2008_jan”

“tb_x_cliente_2008_fev”

“tb_y_cliente_2008_jan”

“tb_y_cliente_2008_fev”

E todas elas com milhões de registos.
Como pode ver eu queria implementar isso na bd, ganhava mto tempo, mas n me parece que vá conseguir.

Vlw Cara
//Graveyard

O exemplo é o de menos - o importante é que você tem de conseguir montar uma string na sua stored procedure para que o comando EXEC consiga executar o comando SQL. Ou seja, você provavelmente vai conseguir. Eu só copiei o exemplo, mas se você sabe suficientemente stored procedures vai ver que é bastante simples, na verdade.

"

Boas ppl,

Obrigado pela ajuda, mas não funciona.


CREATE PROCEDURE "DBA"."createTable1" (in @name2 varchar(10))
as
BEGIN
exec ("create table @name2 (a integer)")
END

O meu código é esse, e não funciona.

Será que alguém tem mais alguma ideia?
Estou aberto a sugestões. (lol)

Valeu ppl
//Graveyard

Claro que não funciona, amigo. É para fazer isto parecido com isto aqui:

 CREATE PROCEDURE "DBA"."createTable1" (in @name2 varchar(10))  
 as  
 BEGIN  
 exec ("create table " + @name2  + " (a integer)")  
 END  

Isso se parece estranhamente com um programa Java, não? Concatenação de strings e outras coisas parecidas.

Boas ppl,

Finalmente tenho boas notícias,
A vossa solução funcionou, porém o meu problema não estava no código, mas sim na versão do Sybase.
Eu estava utilizando o SQL AnyWhere 9, é uma versão free mas com muitas limitações.
Baixei a versão 15 do Adaptive Server Enterprise e funcionou logo.

Pelo menos fiquei a saber o porque é que não funcionava. Era da versão.

Mais uma vez agradeço a vossa ajuda.
//Graveyard

O SQL Anywhere está para o SQL ASE (Adaptive Server Enterprise) mais ou menos como o MS Access está para o MS SQL Server Enterprise. Um é bem mais barato que o outro.