Saltar al contenido

incluyendo parámetros en OPENQUERY

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *