Array
(
)

Erro ao passar parametro para SP e usar na clausula FROM

Mehvsc
   - 16 ago 2006

Sei que esse naum é bem o lugar mais é que é urgente...

Delphi 7 e sqlserver 2000.

Estou com o seguinte problema:

Tenho que passar para a procedure o nome de 2 tabelas, que pra cada usuario no sistema o sistema cria uma nova tabela com o nome do usuario, pois bem preciso passar o nome das tabelas pra que eu possa navegar nelas pelo cursor. mais da o seguinte erro:

Server: Msg 137, Level 15, State 2, Procedure PCP_Revisao, Line 33
Must declare the variable ´@wp_Tmp_tb_Comp´.
Server: Msg 137, Level 15, State 1, Procedure PCP_Revisao, Line 41
Must declare the variable ´@wp_Tmp_tb_Pos´.

Como passei o dia inteiro procurando como resolver este problema e naum consegui to pedindo a ajuda de voces, abaixo segue a parte inicial da storedprocedure

CREATE procedure PCP_Revisao
@wp_idOS int,
@wp_idSO char(2),
@wp_idOF int,
@wp_idDsn varchar(20),
@wp_revisar char(5),
@wp_Tmp_tb_Comp sysname,
@wp_Tmp_tb_Pos sysname
as
--- Declaracao de variaveis
Declare @wp_TReg int

--- Declarando Variáveis do Cursor ...

Declare @idOS int,
@idSubObra char(2),
@idOF int,
@idDesenho varchar(20),
@idPosicao varchar(15),
@idComponente varchar(15),
@alt_nome varchar(30),
@quem_revisou varchar(30),
@pos_tipo char(1),
@revisar char(5)

--- Declaracao de cursores

Declare CurComponentes cursor for
select alt_nome,quem_revisou,iddesenho,idposicao,idcomponente,revisar
from @wp_Tmp_tb_Comp
where (idOS = @wp_idOS) and (idSubObra = @wp_idSO)
and (idOF = @wp_idOF) and (iddesenho = @wp_idDsn)
and (revisar is not null)
order by idOS, idSubObra, idOF, idDesenho, idPosicao, idComponente

Declare CurPosicoes cursor for
select alt_nome,quem_revisou,iddesenho,idposicao,revisar,pos_tipo
from @wp_Tmp_tb_Pos
where (idOS = @wp_idOS) and (idSubObra = @wp_idSO)
and (idOF = @wp_idOF) and (iddesenho = @wp_idDsn)
and (revisar is not null)
order by idOS, idSubObra, idOF, idDesenho, idPosicao

Declare CurDesenhos cursor for
select alt_nome,quem_revisou,iddesenho,revisar
from desenho
where (idOS = @wp_idOS) and (idSubObra = @wp_idSO)
and (idOF = @wp_idOF) and (iddesenho = @wp_idDsn)
and (revisar is not null)
order by idOS, idSubObra, idOF, idDesenho

begin

-- Abrindo o Cursor Componente
open CurComponentes
fetch next from CurComponentes into
@idDesenho,
@idPosicao,
@idComponente,
@alt_nome,
@quem_revisou,
@revisar
-- Loop Principal ...
while @@fetch_status = 0
begin
update componente set
dt_ult_Revisao = CURRENT_TIMESTAMP,
Quem_Revisou = @quem_revisou,
Descr_Revisao = @wp_revisar,
Alt_Nome = @alt_nome,
Alt_DataHora = CURRENT_TIMESTAMP
where (idOS = @wp_idOS)
and (idSubObra = @wp_idSO)
and (idOF = @wp_idOF)
and (iddesenho = @idDesenho)
and (idPosicao = @idPosicao)
and (idComponente = @idComponente)
and (Dt_Ult_Revisao is null)

if @revisar <> ´X´
begin
insert into componente
select * from #@wp_Tmp_tb_Comp
where (idOS = @wp_idOS)
and (idSubObra = @wp_idSO)
and (idOF = @wp_idOF)
and (iddesenho = @idDesenho)
and (idPosicao = @idPosicao)
and (idComponente = @idComponente)
end

update @wp_Tmp_tb_Pos set
Revisar = ´99´
where (idOS = @wp_idOS)
and (idSubObra = @wp_idSO)
and (idOF = @wp_idOF)
and (iddesenho = @idDesenho)
and (idPosicao = @idPosicao)
and (revisar is null)

fetch next from CurComponentes into
@idDesenho,
@idPosicao,
@idComponente,
@alt_nome,
@quem_revisou,
@revisar
end
close CurComponentes
deallocate CurComponentes
end

Micheus
   - 17 ago 2006

Os erros não estariam acontecendo pela presença do # a frente do nome das variáveis?
O é utilizado (no SQLServer) para criar tabelas temporárias.
Se vc deseja criar tabelas temporárias com o nome passado como parâmetro, neste caso acho que vc deverá fazer diferente. Vc deverá criar o SQL dinamicamente. Para isto vc deverá declarar uma variável NVARCHAR para armazenar o SQL, e nele vc estará concatenando a parte fixa do SQL com o valor da variável de modo que após poderá executar esta query.
Já tive que utilizar isto com o SQLServer (versão ?? - tem uns 8 anos). Não lembro exatamente da sintaxe, mas tem um meio de vc executar uma query contida numa variável - pelo que pesquisei, no SQLServer 2000 tem uma stored procedure chamada sp_executesql para este fim. Dê uma olhada neste [url=http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=51]link[/url] tem exemplo do uso dela.