martes, 5 de julio de 2011

OPENQUERY -- OLE DB provider 'SQLOLEDB' supplied inconsistent metadata for a column.

Desde hace un tiempo que tengo 2 servidores Sql Server likeados, es bastante util y comodo, ya que simplemente hacia las consultas al otro servidor de la siguiente forma:


SELECT * FROM LinkedServerName.SchemaName.dbo.TableName


Pero de un momento a otro al consultar una tabla me daba el siguiente error


OLE DB provider 'SQLOLEDB' supplied inconsistent metadata for a column. Metadata information was changed at execution time.


Tenia el presentimiento de que habian cambiado algun tipo de dato o algo en el servidor enlazado (LinkedServerName).

Averiguando por ahi, encontre que se podia ver especificamente cual era la columna que tenia el problema, esto se hace habilitando la transaccion 7300, de la siguiente forma:


DBCC TRACEON (7300)
SELECT * FROM LinkedServerName.SchemaName.dbo.TableName
DBCC TRACEOFF (7300)


Esto da un error, harto mas conocido, como el que me arrojo a mi:
OLE DB error trace [Non-interface error: Column 'PLCur' (compile-time ordinal 16) of object ........., pero un sigue siendo chino para mi, pero al menos sabia que era un problema con la columna "PLCur".

Despues de seguir buscando y buscando, encontre una sentencia para realizar querys de forma distribuida, la cual recomienda de Microsoft, esta es openQuery;


SELECT * from OPENQUERY(LinkedServerName, 'SELECT * FROM SchemaName.dbo.TableName')


De esta forma, ya no tengo mas el maldito problema, pero la gran diferencia que hay en hacer consultas directas y con Openquery, es que OpenQuery ejecuta la consulta en el servidor linkeado y solo retorna el resultado, Por otra parte las consultas directas retornan toda la informacion, y el procesamiento se ejecuta de forma local.






--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com