Recuerda que en las ciencias un error suele tener más de una resoluciones, de igual modo te enseñaremos lo más óptimo y mejor.
Solución:
De la documentación de OPENQUERY se afirma que:
OPENQUERY no acepta variables para sus argumentos.
Consulte este artículo para obtener una solución.
ACTUALIZAR:
Como se sugirió, incluyo las recomendaciones del artículo a continuación.
Pasar Valores Básicos
Cuando se conoce la instrucción Transact-SQL básica, pero tiene que pasar uno o más valores específicos, use un código similar al siguiente ejemplo:
DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT @VAR = 'CA'
SELECT @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'
EXEC (@TSQL)
Pasar toda la consulta
Cuando tenga que pasar la consulta Transact-SQL completa o el nombre del servidor vinculado (o ambos), use un código similar al siguiente ejemplo:
DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = 'MyLinkedServer'
SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ','''
SET @TSQL = 'SELECT au_lname, au_id FROM pubs..authors'')'
EXEC (@[email protected])
Utilice el procedimiento almacenado Sp_executesql
Para evitar las comillas de varias capas, use un código similar al siguiente ejemplo:
DECLARE @VAR char(2)
SELECT @VAR = 'CA'
EXEC MyLinkedServer.master.dbo.sp_executesql
N'SELECT * FROM pubs.dbo.authors WHERE state = @state',
N'@state char(2)',
@VAR
Puede ejecutar un string con OPENQUERY una vez que lo construyas. Si sigue esta ruta, piense en la seguridad y tenga cuidado de no concatenar el texto ingresado por el usuario en su SQL.
DECLARE @Sql VARCHAR(8000)
SET @Sql = 'SELECT * FROM Tbl WHERE Field1 < ''someVal'' AND Field2 IN '+ @valueList
SET @Sql = 'SELECT * FROM OPENQUERY(SVRNAME, ''' + REPLACE(@Sql, '''', '''''') + ''')'
EXEC(@Sql)
Desde la página de MSDN:
OPENQUERY no acepta variables para sus argumentos
Fundamentalmente, esto significa que no puede emitir una consulta dinámica. Para lograr lo que intenta su muestra, intente esto:
SELECT * FROM
OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME') T1
INNER JOIN
MYSQLSERVER.DATABASE.DBO.TABLENAME T2 ON T1.PK = T2.PK
where
T1.field1 = @someParameter
Claramente, si su tabla TABLENAME contiene una gran cantidad de datos, esto también pasará por la red y el rendimiento podría ser bajo. Por otro lado, para una pequeña cantidad de datos, esto funciona bien y evita los gastos generales de construcción de sql dinámico (inyección de sql, comillas de escape) que un exec
enfoque podría requerir.
Si para ti ha sido de utilidad nuestro artículo, nos gustaría que lo compartas con más seniors y nos ayudes a difundir esta información.