En su primer ejemplo con notación "punto", se utiliza el motor de cursor del cliente y la mayoría de las cosas se evalúan localmente. Si selecciona desde una tabla grande y utiliza una cláusula WHERE, los registros se reducirán localmente desde el archivo db remoto. Una vez que los datos se han transferido a través del servidor vinculado, solo entonces se aplica localmente la cláusula WHERE. A menudo esta secuencia es un golpe de rendimiento. Los índices en el db remoto básicamente se vuelven inútiles.
De forma alternativa, cuando usa OPENQUERY, SQL Server envía la instrucción sql a la base de datos de destino para su procesamiento. Durante el procesamiento, cualquier índice de las tablas se aprovecha. También la cláusula where se aplica en el lado de Oracle antes de enviar el conjunto de resultados a SQL Server.
En mi experiencia, a excepción de la más simple de las consultas, OPENQUERY le dará un mejor rendimiento.
Recomendaría usar OpenQuery para todo por los motivos anteriores.
Uno de los puntos fuertes al utilizar OpenQuery que ya puede haber encontrado es comillas simples. Si la cadena sql que se envía al db remoto requiere comillas simples alrededor de una cadena o fecha de fecha, deben escaparse. De lo contrario, terminan inadvertidamente la cadena sql.
Aquí es una plantilla que utilizo cuando estoy frente a las variables en una declaración openquery a un servidor vinculado a cuidar el único problema cita:
DECLARE @UniqueId int
, @sql varchar(500)
, @linkedserver varchar(30)
, @statement varchar(600)
SET @UniqueId = 2
SET @linkedserver = 'LINKSERV'
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL'
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '
SET @Statement = @Statement + '''' + @SQL + ''')'
EXEC(@Statement)