Estou tentando ler um arquivo txt em um diretório na rede à partir do SQL Server 7( S.O. win 2000 Prof.)e não estou conseguindo, o que acontece é que quando uso na minha maquina em casa (winXP) ele lê normalmente.
Poderiam me apontar o erro, seria no XPShell?
Segue abaixo o código para análise.
if exists (select * from sysobjects where id = object_id(N'[dbo].[sp_job_sql]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_job_sql]
GO
create procedure [dbo].sp_job_sql as
/* Autor : Sidnei Manço */
/* Data : 99/99/9999 */
set nocount on
Declare @path_txt varchar(50),
@comando nvarchar(250),
@string_item nvarchar(300),
@linhas int,
@id_linha_item int,
@id_linha int,
@nome_arq varchar(50),
@nr_error int,
@errmsg varchar(255),
@arquivo_renomeado varchar(50),
@dt_arq datetime,
@id_codigo varchar(06),
@nome varchar(40)
select @path_txt = 'C:\LIXO\teste_job_sql\'
create table #tmp_dir( campo varchar(255) null )
create table #tmp_arq( id_linha int identity(1,1) ,
campo varchar(255) null ,
nome_arq varchar(50) null ,
dt_arq datetime null ,
processa char(1) default 'S' )
create NONCLUSTERED index idx_tmp_arq on #tmp_arq(id_linha)
create table #tmp_item( id_linha int identity(1,1) ,
campo varchar(300) null )
create NONCLUSTERED index idx_tmp_item on #tmp_item(id_linha)
select @comando = 'dir '+@path_txt+'*.txt /od'
insert #tmp_dir
exec master..xp_cmdshell @comando
insert #tmp_arq( campo )
select campo
from #tmp_dir
/* limpa linhas desnecessarias */
select @linhas=max(id_linha)
from #tmp_arq
delete from #tmp_arq where id_linha<=5
delete from #tmp_arq where id_linha>=@linhas-1
delete from #tmp_arq where isnumeric( substring( campo,1,2))=0
/* acerta nome do arq, data gerada e se já foi carregado */
update #tmp_arq
set nome_arq = substring(campo,37,50)
-- select * from #tmp_arq
select @id_linha=0
while exists( select 1 from #tmp_arq where id_linha>@id_linha )
begin
select top 1 @nome_arq = nome_arq ,
@dt_arq = dt_arq ,
@id_linha = id_linha
from #tmp_arq
where id_linha>@id_linha
order by id_linha
select @comando = 'type '+@path_txt+@nome_arq
set @arquivo_renomeado = substring( @nome_arq, 1, charindex('.',@nome_arq ) )+'REN'
insert #tmp_item
exec master..xp_cmdshell @comando
-- Le os itens da requisição
--- commit transaction
set @nr_error = 0
select @id_linha_item=0
while exists( select 1 from #tmp_item where id_linha>@id_linha_item )
Pergunta
Guest - Roger -
Bom dia à todos,
Estou tentando ler um arquivo txt em um diretório na rede à partir do SQL Server 7( S.O. win 2000 Prof.)e não estou conseguindo, o que acontece é que quando uso na minha maquina em casa (winXP) ele lê normalmente.
Poderiam me apontar o erro, seria no XPShell?
Segue abaixo o código para análise.
if exists (select * from sysobjects where id = object_id(N'[dbo].[sp_job_sql]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_job_sql]
GO
create procedure [dbo].sp_job_sql as
/* Autor : Sidnei Manço */
/* Data : 99/99/9999 */
set nocount on
Declare @path_txt varchar(50),
@comando nvarchar(250),
@string_item nvarchar(300),
@linhas int,
@id_linha_item int,
@id_linha int,
@nome_arq varchar(50),
@nr_error int,
@errmsg varchar(255),
@arquivo_renomeado varchar(50),
@dt_arq datetime,
@id_codigo varchar(06),
@nome varchar(40)
select @path_txt = 'C:\LIXO\teste_job_sql\'
create table #tmp_dir( campo varchar(255) null )
create table #tmp_arq( id_linha int identity(1,1) ,
campo varchar(255) null ,
nome_arq varchar(50) null ,
dt_arq datetime null ,
processa char(1) default 'S' )
create NONCLUSTERED index idx_tmp_arq on #tmp_arq(id_linha)
create table #tmp_item( id_linha int identity(1,1) ,
campo varchar(300) null )
create NONCLUSTERED index idx_tmp_item on #tmp_item(id_linha)
select @comando = 'dir '+@path_txt+'*.txt /od'
insert #tmp_dir
exec master..xp_cmdshell @comando
insert #tmp_arq( campo )
select campo
from #tmp_dir
/* limpa linhas desnecessarias */
select @linhas=max(id_linha)
from #tmp_arq
delete from #tmp_arq where id_linha<=5
delete from #tmp_arq where id_linha>=@linhas-1
delete from #tmp_arq where isnumeric( substring( campo,1,2))=0
/* acerta nome do arq, data gerada e se já foi carregado */
update #tmp_arq
set nome_arq = substring(campo,37,50)
-- select * from #tmp_arq
select @id_linha=0
while exists( select 1 from #tmp_arq where id_linha>@id_linha )
begin
select top 1 @nome_arq = nome_arq ,
@dt_arq = dt_arq ,
@id_linha = id_linha
from #tmp_arq
where id_linha>@id_linha
order by id_linha
select @comando = 'type '+@path_txt+@nome_arq
set @arquivo_renomeado = substring( @nome_arq, 1, charindex('.',@nome_arq ) )+'REN'
insert #tmp_item
exec master..xp_cmdshell @comando
-- Le os itens da requisição
--- commit transaction
set @nr_error = 0
select @id_linha_item=0
while exists( select 1 from #tmp_item where id_linha>@id_linha_item )
begin
select top 1 @string_item = campo,
@id_linha_item = id_linha
from #tmp_item
where id_linha>@id_linha_item
order by id_linha
set @id_codigo = substring( @string_item, 1, 6 )
set @nome = substring( @string_item, 8, 20 )
-- select @id_codigo
-- select @nome
insert tb_job_sql( id_codigo, nome )
values( @id_codigo,
@nome )
set @nr_error = @nr_error + @@error
end
delete from #tmp_item
----
-- Deleta caso tenha ocorrido algum erro
-- if @nr_error <> 0
-- begin
-- rollback
-- end
-- else
-- begin
-- commit tran
-- end
----
select @comando = 'move '+@path_txt+@nome_arq+ ' '+@path_txt+@arquivo_renomeado
exec master..xp_cmdshell @comando
end
drop table #tmp_dir
drop table #tmp_arq
drop table #tmp_item
set nocount off
GO
SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
SET ANSI_WARNINGS ON
GO
-- GRANT EXECUTE ON [dbo].[sp_job_sql] TO [***grupo]
GO
-- @errmsg varchar(255)
Agradeço Antecipadamente,
Rogerio
rogerio@tectoy.com.br
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.