2011-03-11 26 views
18

Tengo una instancia de SQL Server que he agregado un servidor vinculado a otra instancia de SQL. La tabla a la que estoy accediendo en el servidor vinculado contiene tipos espaciales. Cuando intento para consultar la tabla recibo un error:SQL Server espacial y servidores vinculados

Objects exposing columns with CLR types are not allowed in distributed queries. Please use a pass-through query to access remote object.

Si uso OPENQUERY con la misma consulta consigo otro error:

A severe error occurred on the current command. The results, if any, should be discarded.

¿Hay alguna forma de consultar las tablas que contienen tipos espaciales a través de servidores vinculados?

Respuesta

14

Una forma de evitar esto es para pasar los datos espaciales como NVARCHAR (MAX)

select go=geometry::STGeomFromText(go,0) 
from openquery([other\instance], 
'select go=convert(nvarchar(max),go) from tempdb.dbo.geom') 

nota: go es un nombre de columna, la abreviatura de la geometría a objetos

O usando la función en lugar de conversión explícita

select go=geometry::STGeomFromText(go,0) 
from openquery([other\instance], 
'select go=go.STAsText() from tempdb.dbo.geom') 
+0

para la geografía, el uso: la geografía :: STGeomFromText (vaya, 4326) –

4

Tengo otra solución alternativa. No se aplica a la pregunta del OP ya que estaban tratando de seleccionar los datos espaciales. Incluso si no está seleccionando las columnas que contienen datos espaciales, igual obtendrá este error. Por lo tanto, si necesita consultar dicha tabla y no necesita recuperar los datos espaciales, puede crear una vista para la tabla (seleccionando solo las columnas que necesita, excluyendo las columnas de datos espaciales), y luego consultar contra esa vista en su lugar .

11

Me encontré con el mismo problema, pero la solución aceptada no era una opción en mi caso, debido a que muchas aplicaciones no se podían cambiar para esperar una consulta totalmente diferente.

En cambio, creo que encontré la forma de engañar al sistema. En ejecución de servidor local:

CREATE VIEW stage_table 
AS 
SELECT * 
FROM OPENQUERY([REMOTESERVER],'SELECT * FROM [REMOTEDB].[SCHEMA].TARGET_TABLE'); 
GO 
CREATE SYNONYM TARGET_TABLE FOR stage_table; 
GO 

Voila, ahora se puede simplemente utilizar

SELECT * FROM TARGET_TABLE; 

que es probablemente lo que esperan sus aplicaciones.

probado el escenario anterior con el servidor local: SQLEXPRESS 2008 R2 y servidor remoto SQL Express 2014.

+0

me encontré con 'objetos que exponen columnas con tipos CLR no están permitidos en consultas distribuidas. Utilice una consulta de paso para acceder al objeto remoto ': la sugerencia de pkExec resolvió este problema. – AAsk

+2

Sólo sé claro. La transformación exacta necesaria es la siguiente. Si una consulta del formulario 'select * from [remoteservername]. [Remotedatabasename]. [Schemaname]. [Tablename]' está fallando, simplemente sustitúyala por 'select * from OPENQUERY ([remoteservername], 'select * from [remotedatabasenameame ]. [schemaname]. [tablename] ') '. Básicamente tiene que mover el nombre del servidor remoto (es decir, no su nombre de dominio o algo así ... pero el nombre arbitrario que lo vinculó como) fuera del identificador de la tabla y pasarlo como un parámetro para abrir la búsqueda. – Triynko

+0

@Triynko Mi respuesta cubre incluso el caso donde la forma de la consulta es "SELECT * FROM table_name". Si usa lo que menciona en su comentario, entonces para los tipos de datos espaciales la consulta fallará (según el comentario de AAsk). – pkExec