Mas o que significa isto?
Simplificando: significa que você pode utilizar o retorno desta função na cláusula FROM de uma instrução SELECT, por exemplo. Retornar dados no formato result set nada mais é do que retornar os dados em linhas e colunas, como se fosse uma tabela.
As funções que retornam um result set também são muito importantes para a integração do SQL Server com outras fontes de dados remotas ou não, e podem ser bem úteis quando desejamos obter dados exporádicos sem ter que necessariamente criar um ambiente de servidor linkado. Além disso, existem as funções que fazem a pesquisa em um índice full text.
A partir do SQL Server 2000 podemos criar as nossas próprias funções que retornam um result set através das Inline Table-valued Functions e das Multi-Statement Table-valued Functions inclusive passando parâmetros para as funções.
Sempre que quisermos acessar dados que estão em outras fontes de dados devemos utilizar a seguinte notação para nos referirmos a objetos que estão em outros servidores:
nome_servidorinstâcia.banco.usuario.tabela
Sendo que nem sempre precisamos passar todos estes nomes. A esta notação damos o nome de four-part object name ou fully qualified object name.
Uma boa dica é criar uma view a partir da instrução SELECT que utiliza a função que retorna um row set. Desta maneira o usuário que utilizará a query nem irá saber de onde os dados realmente estão vindo.
Mais um detalhe: o SQL Server utiliza nativamente o OLE DB para fazer a conexão com fonte de dados externas. Verifique os providers instalados na sua máquina e como você deve proceder para se conectar com a fonte de dados antes de começar a utilizar algumas das funções que retornam um row set assim como qual é a string de conexão específica para um determinado provider.
Função OPENDATASOURCE()
Esta função nos permite abrir uma conexão com outra fonte de dados, obter dados da fonte de dados e fechar a conexão.
Para fazer a conexão com a fonte de dados devemos passar uma string de conexão OLE DB válida para a máquina que está enviando a instrução. Por exemplo:
SELECT
*
FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=mauro;User ID=sa;Password=2347895'
).Northwind.dbo.Categories
Percebam que no exemplo acima a instrução SELECT abre a conexão com o servidor SQL Server chamado mauro, passa um usuário e senha válido e obtem todos os dados da tabela Categories, do banco de dados Northwind.
Não é muito recomendado utilizar OPENDATASOURCE() quando desejamos obter os dados com frequência. Para estes casos, devemos configurar um ambiente de servidor linkado.
Função OPENROWSET()
Esta função nos permite abrir uma conexão com outra fonte de dados, obter os dados através de uma query ou Stored Procedure e fechar a conexão.
Para fazer a conexão com a fonte de dados, devemos passar um string de conexão OLE DB válido para a máquina que está enviando a instrução. Por exemplo:
SELECT
a.*
FROM
OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'D:Northwind.mdb',Orders)
AS a
Na query acima obtemos todos os dados que estão na tabela Orders do banco de dados em Access chamado Northwind.mdb. Atenção: para que o exemplo funcione, verifique se a versão do Microsoft Jet consegue abrir o arquivo Access sem problemas e que não há uma senha de proteção no arquivo. Mas um exemplo:
SELECT
* FROM
OPENROWSET('MSDAORA',
'dbMauro';'mak';'123', 'SELECT * FROM
TOP_FIELD')
Obtem os dados do servidor ORACLE que será apontado pelo nome SQL* NET ‘dbMauro’ e passa o usuário ‘mak’ com a senha 123. Feita a conexão, a query é executada e os dados da tabela TOP_FIELD que o usuário mak possui são retornados para o SQL Server.
Dica: antes de tentar fazer este tipo de acesso ao banco Oracle, verifique se o servidor em que o SQL Server está instalado consegue se conectar com o nome SQL* Net (configurado no arquivo TNSNAMES.ORA da parte client do ORACLE) através do SQL Plus, por exemplo.
Também não devemos utilizar OPENROWSET() se desejamos obter os dados da fonte de dados com muita frequência.
Função OPENQUERY()
Esta função possui a mesma funcionalidade de OPENROWSET() porém ela somente funcionará quando se já tem um servidor linkado previamente configurado. Exemplo
-- Primeiro criamos um servidor SQL Server linkado sem mapear uma conta de login
USE
master
GO
EXEC sp_addlinkedserver
'ServLnk
N'SQL Server'
-- Agora executamos uma Stored Procedure neste servidor linkado e mostramos o resultado -- em forma de resul set
SELECT *
FROM OPENQUERY( ServLnk , 'EXEC PROC_TESTE')
O assunto de servidores linkados é bem extenso e involve diversos tópicos. Futuramente estarei abordando este assunto em uma outra coluna. Quando se deseja obter dados periodicamente de uma fonte externa de dados, é aconselhável utilizar um ambiente de servidor linkado em conjunto com a função OPENQUERY().
Função OPENXML()
Conforme já avisto aqui no iMasters , a funções OPENXML() serve para retonar os dados que estão sem XML para o formato result set. Abaixo temos um exemplo:
-- Primeiro definimos as variáveis que armazenaram o identificador e o XML,
-- respectivamente.
DECLARE
@idoc int
DECLARE
@doc varchar(1000)
-- Atribuimos o conteúdo do XML a uma variável
SET
@doc ='
<ESCOLA>
<AULA NOME="CÁLCULO" PROFESSOR="CARLOS"
DURACAO="1"></AULA>
<AULA NOME="ALGEBRA" PROFESSOR="NIVALDO"
DURACAO="3"></AULA>
</ESCOLA>'
-- Prepara o documento e cria um identificador para ele
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Executa um SELECT utilizando OPENXML() para retornar os dados.
SELECT
* FROM
OPENXML
(@idoc, '/ESCOLA/AULA')
WITH ( NOME varchar(10),
PROFESSOR varchar(20),
DURACAO INT)
-- Remove o identificador do XML
EXEC sp_xml_removedocument @idoc
Função CONTAINSTABLE() E FREETEXTTABLE()
Para se utilizar estas duas funções, primeiro devemos montar todo um ambiente para trabalhar com index full text e o Microsoft Search. Ai vai um exemplo de como podemos utilizar estas funções (supondo que exista um índice full text na coluna DESCRICAO da tabela TAB1 e que todo o ambiente para índices full text esteja criado).
SELECT
* FROM
FREETEXTTABLE(TAB1,DESCRICAO
, ‘ bola redonda ‘)
A instrução SELECT acima vai retornar uma tabela com o campo DESCRICAO e todos os registros que contém campo DESCRICAO qualquer relação com as palavras ‘bola’ e ‘redonda’.
SELECT
* FROM
CONTAINSTABLE(TAB1,DESCRICAO
, ' "choc*" ')
A instrução SELECT acima vai retornar uma tabela com o campo DESCRICAO e todos os registros que do texto que iniciem por choc e terminem com qualquer texto. Se a função for utilizada desta maneira podemos obter um resultado parecido com o operador LIKE.
As funções FREETEXTTABLE() e CONTAINSTABLE() possuiem a mesma funcionalidade de FREETEXT() e CONTAINS(). A diferença é que as duas primeiras devem ser utilizadas em um cláusula FROM como fonte de dados e as duas últimas na cláusula WHERE para filtrar os resultados.
Abraço galera, e até a semana que vem!
Os textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.
Mauro Pichiliani é mestre em computação, possui as certificações MCP, MCDBA, MCT e MCTS e atua como consultor de banco de dados com enfoque na área de tunning.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.