Pergunta:
tenho um Access DB e uma SQL que armazenam informações. Nos recursos do Servidor Vinculado do SQL 7.0, permiti que SQL o Access DB como apenas outro banco de dados SQL. Também redigi um procedimento armazenado que copia registros do Access DB para a SQL. Em execução do ISQL/Analisador de Consultas, o procedimento armazenado é executado e funciona corretamente. Chamar o procedimento armazenado de Destreza produz a seguinte mensagem de erro SQL Server: as consultas heterogêneas exigem que as opções ANSI_NULLS e ANSI_WARNINGS sejam definidas para a
conexão. Isso garante uma semântica de consulta consistente. Habilita essas opções e reemita sua consulta. Posso até mesmo executar esse procedimento armazenado de Destreza?
Resposta:
Sim, mas vamos ter que modificar ligeiramente o procedimento armazenado. O motivo pelo qual ele falha é que, para ler SQL tabelas adequadamente em Destreza, essas opções devem ser desligadas para que os procedimentos armazenados em Destreza emitam esses comandos antes de executar o procedimento armazenado. O usuário deve certificar-se de que os dados que violam essas regras não são introduzidos na SQL tabela. No exemplo abaixo, o table_access é a tabela de acesso. O table_test é a SQL.
if exists (select * from sysobjects where id =
object_id('dbo.access_update') and sysstat & 0xf = 4)
drop procedure dbo.access_update
GO
create procedure dbo.access_update @O_SQL_Error_State int = NULL output
as
INSERT INTO access_table ( DOCNUMBR, DOCAMNT )
SELECT access_test.DOCNUMBR, access_test.DOCAMNT
FROM access_test
GO
Podemos modificar o procedimento armazenado para definir nossos avisos desta forma:
if exists (select * from sysobjects where id =
object_id('dbo.access_update') and sysstat & 0xf = 4)
drop procedure dbo.access_update
GO
create procedure dbo.access_update @O_SQL_Error_State int = NULL output
as
set ANSI_NULLS ON
SET ANSI_WARNINGS ON
exec access_table2 ( DOCNUMBR, DOCAMNT )
GO
Nesse caso, o procedimento armazenado herda os atributos do que o chama. Para essa situação, a Destreza chama theaccess_tableprocedure que aciona o ANSI_NULLS & ANSI_WARNINGS e, em seguida, chama o procedimento armazenado real e passa em nossos parâmetros.
Este artigo foi TechKnowledge Document ID:10011