sql >> Base de Datos >  >> RDS >> Sqlserver

Sugerencias para usar SQL Server con Salesforce SOQL

Índice

  1. Resumen
  2. Las consultas de selección simple en SQL Server no funcionan
  3. Inserción masiva de datos mediante el controlador SOQL
  4. Actualizar y eliminar el agrupamiento de consultas
  5. Soporte transaccional de Easysoft
  6. Validación de esquema perezoso
  7. Limitaciones de OLEDB de Microsoft para el proveedor ODBC

Resumen

Este documento brinda algunos consejos sobre el uso de SQL Server con Salesforce. Los componentes utilizados para conectar SQL Server a Salesforce son un servidor vinculado de SQL Server y el controlador ODBC de Easysoft Salesforce. En este artículo se describe cómo conectar SQL Server a Salesforce. Para los ejemplos de este documento, el nombre del servidor vinculado (al que hace referencia en sus comandos SQL) utilizado es SFSOQL8.

Todo el SQL de este documento se probó con SQL Server 2017 y el controlador ODBC de Easysoft Salesforce versión 2.0.0.

Si desea contribuir con este documento, envíe su envío por correo electrónico a .

Las consultas de selección simple en SQL Server no funcionan

Digamos que está intentando ejecutar esta consulta en SQL Server:

SELECT Id FROM SFSOQL8...Account

SQL Server convierte ese SQL en:

SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"

Como el lenguaje SOQL de Salesforce no admite el cambio de nombre de tablas y columnas de esa manera, termina con este error:

OLE DB provider "MSDASQL" for linked server "SFSOQL8" returned message "[Easysoft][Salesforce SOQL ODBC Driver]General error: Query Failed: 'MALFORMED_QUERY: only aggregate expressions use field aliasing'". Msg 7320, Level 16, State 2, Line 1 Cannot execute the query "SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"" against OLE DB provider "MSDASQL" for linked server "SFSOQL8".

SQL Server tiene dos métodos disponibles para enviar SOQL al controlador Easysoft:

  1. OPENQUERY , que se puede usar junto con tablas locales para unir datos locales y remotos.
  2. EXEC que se puede usar junto con parámetros para ejecutar directamente su SOQL contra Salesforce.

Para demostrar estos métodos, comenzaremos con una unión de tabla SOQL:

SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity

En SQL Server, puede ejecutar cualquiera de las siguientes consultas:

SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')

—O—

EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8

Prácticamente no hay diferencia en el rendimiento ya que el SOQL que ha escrito se pasa directamente al servidor de Salesforce.

Asimismo, todas las funciones SOQL también están disponibles utilizando los mismos métodos:

SELECT * FROM OPENQUERY(SFSOQL8, 'select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), ''mi'') from Account where Name like ''Bur%'' ')
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Type, BillingCountry, GROUPING(Type) grpType, GROUPING(BillingCountry) grpCty, COUNT(id) accts FROM Account GROUP BY CUBE(Type, BillingCountry) ORDER BY GROUPING(Type), GROUPING(BillingCountry)')

Si pasa un SOQL no válido, el controlador SOQL de Easysoft devolverá el error directamente desde Salesforce. Por ejemplo:

SELECT * FROM OPENQUERY(SFSOQL8, 'select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), ''mo'') from Account where Name like ''Bur%'' ')
OLE DB provider "MSDASQL" for linked server "SFSOQL8" returned message "[Easysoft][Salesforce SOQL ODBC Driver]General error: Query Failed: 'INVALID_FIELD: 
select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775
                          ^
ERROR at Row:1:Column:27
Invalid distance unit: mo. Valid unit: 'mi', 'km''".
Msg 7320, Level 16, State 2, Line 1
Cannot execute the query "select Id, Name, DISTANCE(CustLocation__c , GEOLOCATION(37.775,-122.418), 'mo') from Account where Name like 'Bur%' " against OLE DB provider "MSDASQL" for linked server "SFSOQL8". 

Puede encontrar más información sobre el lenguaje SOQL aquí.

Inserción masiva de datos mediante el controlador SOQL

Dentro de la API de SOAP de Salesforce hay una función que le permite insertar hasta 200 filas de datos desde una sola llamada a la API de SOAP. El controlador ODBC SOQL de Easysoft Salesforce hace uso de esta función y le permite usar SQL Server TSQL para cargar de forma masiva hasta 200 filas a la vez.

En mi ejemplo, agregaré nuevos registros al objeto Cuenta dentro de Salesforce. Este es un ejemplo muy básico con solo unas pocas columnas de datos, pero espero que esto explique cómo son posibles las inserciones masivas desde SQL Server. En SQL Server, tengo una tabla local llamada Cuenta que se parece a:

begin
    declare @BlockCount as int
    declare @IsPosted as int
    declare @PrmName As nvarchar(255)
    declare @PrmAddress As nvarchar(255)
    declare @PrmTown As nvarchar(40)
    declare @PrmPostCode As nvarchar(30)
    declare @PrmDescription As nvarchar(255)
	declare @SQL as nvarchar(255)

	set @BlockCount=0
	set @SQL='insert into Account (Name, BillingStreet, BillingCity, BillingPostalCode, Description ) values ( ?, ?, ?, ?, ? )'

	declare select_cursor cursor local FORWARD_ONLY for 
		select AccName, "Property Description", "Address", Town, PostCode from Account Order by Id

	open select_cursor
	fetch next from select_cursor into @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription
	while @@FETCH_STATUS=0
	begin
		if (@BlockCount=0)
		Begin
			set @IsPosted=0
			exec('Begin Trans') at SFSOQL8
		end
		set @BlockCount=@BlockCount+1

		exec (@SQL, @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription) at SFSOQL8

		if (@BlockCount=200)
		Begin
			set @IsPosted=1
			exec('Commit') at SFSOQL8
		end
		fetch next from select_cursor into @PrmName, @PrmAddress, @PrmTown, @PrmPostCode, @PrmDescription

	end

	if (@IsPosted=0)
	begin
		exec('Commit') at SFSOQL8
	end
	
	close select_cursor;
	deallocate select_cursor;
end

Este TSQL funciona leyendo mi tabla de Cuenta local en un cursor.

Al comienzo del primer bloque de 200 filas, Begin Trans se llama, lo que le dice al controlador de Easysoft que cualquier dato que se le pase se retendrá hasta que se realice un Commit o un Rollback se llama.

El EXEC La función envía cada fila encontrada en el cursor al controlador Easysoft. A continuación, el controlador genera la llamada API SOAP necesaria. Cuando se han enviado 200 filas a Easysoft, envío un Commit , lo que hace que el controlador envíe la llamada API SOAP a Salesforce.

Cuando se llega al final del cursor, si hay registros enviados al controlador de Easysoft que no se han pasado a Salesforce, envío un Commit final. . A continuación, el cursor se cierra y se desasigna.

El límite de 200 filas es un límite interno dentro de Salesforce. Si intenta enviar más de 200 filas, obtendrá un error de Salesforce. El controlador de Easysoft no tiene límites integrados, por lo que si Salesforce aumenta el límite de 200 filas en futuras versiones de la API de SOAP, el controlador de Easysoft funcionará automáticamente con el nuevo límite.

Al usar este método de inserción masiva, no hay límite para la cantidad de tablas en las que puede insertar datos en un solo bloque, por lo que funcionará el siguiente TSQL:

Begin
	exec('Begin Trans') at SFSOQL8
	exec('Insert into Account ( Name ) values (''Richard Test'') ') at SFSOQL8
	exec('Insert into Opportunity ( Name, StageName, CloseDate ) values (''Richard Test'', ''My Stage'', ''2018-08-14T10:07:00Z'') ') at SFSOQL8
	exec('Commit') at SFSOQL8
End

Al usar el método Begin Trans/Commit para inserciones, solo puede enviar declaraciones de inserción. No puede mezclar y combinar inserciones y actualizaciones, ya que esto no es compatible con la API de SOAP de Salesforce.

Actualizar y eliminar el agrupamiento de consultas

Nuestro controlador SOQL tiene un método integrado para agrupar transacciones de datos, cuando se usa con una consulta ACTUALIZAR o ELIMINAR.

Este ejemplo muestra cómo actualizo una columna personalizada a un valor establecido.

EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8

Salesforce no admite ACTUALIZACIONES o ELIMINACIONES mediante SOQL, por lo que el controlador Easysoft tiene que convertir la consulta en una SELECCIÓN SOQL. Las filas devueltas por SELECCIONAR luego se agrupan en bloques de hasta 200 y se envían un bloque a la vez para una ACTUALIZACIÓN o ELIMINACIÓN.

Soporte transaccional de Easysoft

El controlador ODBC SOQL de Easysoft Salesforce solo admite un único nivel de transacción. Así que Begin Trans seguido de algunos INSERT se pueden enviar a Salesforce con un COMMIT o tirado dentro del controlador usando un ROLLBACK .

Validación de esquema perezoso

En las propiedades del servidor vinculado de SQL Server, en la sección "Opciones del servidor", hay una opción para "Validación de esquema diferido". De forma predeterminada, se establece en FALSO, lo que hace que SQL Server cuando ejecute una instrucción SELECT envíe la instrucción dos veces. La primera vez que se envía, SQL Server utiliza los detalles transmitidos para generar los metadatos sobre su conjunto de resultados. A continuación, la consulta se envía de nuevo. Esta es una sobrecarga bastante costosa, por lo que Easysoft recomendaría que establezca "Lazy Schema Validation" en TRUE, lo que significa que solo se envía un SELECT, que obtiene tanto los metadatos como los datos. Esto también reduce la cantidad de llamadas a la API de Salesforce que se realizan.

Limitaciones de OLEDB de Microsoft para el proveedor ODBC

Los detalles sobre las limitaciones de OLEDB para el proveedor ODBC se pueden encontrar aquí:

https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx