Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Tipps zur Verwendung von SQL Server mit Salesforce SOQL

Inhaltsverzeichnis

  1. Übersicht
  2. Einfache Auswahlabfragen in SQL Server funktionieren nicht
  3. Masseneinfügen von Daten mit dem SOQL-Treiber
  4. Bulk von Suchanfragen aktualisieren und löschen
  5. Easysoft-Transaktionsunterstützung
  6. Lazy Schema-Validierung
  7. Einschränkungen von Microsofts OLEDB für ODBC-Anbieter

Übersicht

Dieses Dokument enthält einige Tipps zur Verwendung von SQL Server mit Salesforce. Die zum Verbinden von SQL Server mit Salesforce verwendeten Komponenten sind ein SQL Server Linked Server und der Easysoft Salesforce ODBC-Treiber. Wie Sie SQL Server mit Salesforce verbinden, wird in diesem Artikel beschrieben. Für die Beispiele in diesem Dokument lautet der Name des Verbindungsservers (auf den Sie in Ihren SQL-Befehlen verweisen) SFSOQL8.

Das gesamte SQL in diesem Dokument wurde mit SQL Server 2017 und der Easysoft Salesforce ODBC-Treiberversion 2.0.0 getestet.

Wenn Sie zu diesem Dokument beitragen möchten, senden Sie Ihre Einreichung bitte per E-Mail an .

Einfache Auswahlabfragen in SQL Server funktionieren nicht

Angenommen, Sie versuchen, diese Abfrage in SQL Server auszuführen:

SELECT Id FROM SFSOQL8...Account

SQL Server konvertiert dieses SQL in:

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

Da die SOQL-Sprache von Salesforce das Umbenennen von Tabellen und Spalten auf diese Weise nicht unterstützt, erhalten Sie am Ende diesen Fehler:

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 verfügt über zwei Methoden zum Senden von SOQL an den Easysoft-Treiber:

  1. OPENQUERY , die in Verbindung mit lokalen Tabellen verwendet werden kann, um entfernte und lokale Daten zusammenzuführen.
  2. EXEC die zusammen mit Parametern verwendet werden können, um Ihre SOQL direkt gegen Salesforce auszuführen.

Um diese Methoden zu demonstrieren, beginnen wir mit einem SOQL-Tabellenjoin:

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

In SQL Server können Sie eine der folgenden Abfragen ausführen:

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

– Oder –

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

Es gibt fast keinen Leistungsunterschied, da die von Ihnen geschriebene SOQL direkt an den Salesforce-Server weitergeleitet wird.

Ebenso sind alle SOQL-Funktionen mit denselben Methoden verfügbar:

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)')

Wenn Sie ungültiges SOQL übergeben, gibt der Easysoft SOQL-Treiber den Fehler direkt von Salesforce zurück. Zum Beispiel:

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". 

Weitere Informationen zur SOQL-Sprache finden Sie hier.

Masseneinfügung von Daten mit dem SOQL-Treiber

Innerhalb der Salesforce-SOAP-API gibt es eine Funktion, mit der Sie bis zu 200 Datenzeilen aus einem einzigen SOAP-API-Aufruf einfügen können. Der SOQL-ODBC-Treiber von Easysoft Salesforce nutzt diese Funktion und ermöglicht Ihnen die Verwendung von SQL Server TSQL zum gleichzeitigen Massenladen von bis zu 200 Zeilen.

In meinem Beispiel füge ich dem Account-Objekt in Salesforce neue Datensätze hinzu. Dies ist ein sehr einfaches Beispiel mit nur wenigen Datenspalten, aber ich hoffe, dies erklärt, wie Masseneinfügungen von SQL Server aus möglich sind. In SQL Server habe ich eine lokale Tabelle namens Account, die so aussieht:

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
freigeben

Dieses TSQL funktioniert, indem es meine lokale Account-Tabelle in einen Cursor einliest.

Am Anfang des ersten Blocks von 200 Zeilen, dem Begin Trans aufgerufen, was dem Easysoft-Treiber mitteilt, dass alle an ihn übergebenen Daten gehalten werden, bis entweder ein Commit oder ein Rollback heißt.

Die EXEC Funktion sendet jede im Cursor gefundene Zeile an den Easysoft-Treiber. Der Treiber baut dann den erforderlichen SOAP-API-Aufruf auf. Wenn 200 Zeilen an Easysoft gesendet wurden, sende ich ein Commit , wodurch der Treiber den SOAP-API-Aufruf an Salesforce sendet.

Wenn das Ende des Cursors erreicht ist und Datensätze an den Easysoft-Treiber gesendet wurden, die noch nicht an Salesforce übergeben wurden, sende ich ein letztes Commit . Der Cursor wird dann geschlossen und die Zuordnung aufgehoben.

Das Limit von 200 Zeilen ist ein internes Limit in Salesforce. Wenn Sie versuchen, mehr als 200 Zeilen zu senden, erhalten Sie einen Salesforce-Fehler. Der Easysoft-Treiber hat keine eingebauten Limits. Wenn Salesforce also das Limit von 200 Zeilen in zukünftigen Versionen der SOAP-API erhöht, wird der Easysoft-Treiber automatisch mit dem neuen Limit arbeiten.

Bei Verwendung dieser Masseneinfügungsmethode gibt es keine Begrenzung für die Anzahl der Tabellen, in die Sie Daten in einem einzigen Block einfügen können, daher funktioniert die folgende 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

Wenn Sie die Begin Trans/ Commit-Methode für Einfügungen verwenden, können Sie nur Einfügungsanweisungen senden. Sie können Einfügungen und Aktualisierungen nicht mischen und abgleichen, da dies in der Salesforce-SOAP-API nicht unterstützt wird.

Anfrage-Bulk aktualisieren und löschen

Unser SOQL-Treiber verfügt über eine integrierte Methode zum Sammeln von Datentransaktionen, wenn er mit einer UPDATE- oder einer DELETE-Abfrage verwendet wird.

Dieses Beispiel zeigt, wie ich eine benutzerdefinierte Spalte auf einen festgelegten Wert aktualisiere.

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

Salesforce unterstützt keine UPDATEs oder DELETEs mit SOQL, daher muss der Easysoft-Treiber die Abfrage in ein SOQL SELECT konvertieren. Die von SELECT zurückgegebenen Zeilen werden dann in Blöcke von bis zu 200 zusammengefasst und jeweils blockweise für ein UPDATE oder DELETE gesendet.

Easysoft-Transaktionsunterstützung

Der Easysoft Salesforce SOQL ODBC-Treiber unterstützt nur eine einzige Transaktionsebene. Also ein Begin Trans gefolgt von einigen INSERTs können mit einem COMMIT an Salesforce gesendet werden oder innerhalb des Treibers mit einem ROLLBACK weggeworfen werden .

Lazy-Schema-Validierung

In den Eigenschaften Ihres SQL Server-Verbindungsservers im Abschnitt „Serveroptionen“ befindet sich eine Option für „Lazy Schema Validation“. Standardmäßig ist dies auf FALSE gesetzt, was dazu führt, dass SQL Server beim Ausführen einer SELECT-Anweisung die Anweisung zweimal sendet. Beim ersten Senden verwendet SQL Server die zurückgegebenen Details, um die Metadaten zu Ihrer Ergebnismenge aufzubauen. Dann wird die Abfrage erneut gesendet. Dies ist ein ziemlich teurer Overhead, daher würde Easysoft empfehlen, "Lazy Schema Validation" auf TRUE zu setzen, was bedeutet, dass nur ein SELECT gesendet wird, das sowohl die Metadaten als auch die Daten erhält. Dadurch wird auch die Anzahl der getätigten Salesforce-API-Aufrufe reduziert.

Einschränkungen von Microsofts OLEDB für ODBC-Anbieter

Einzelheiten zu den Einschränkungen des OLEDB für ODBC-Anbieter finden Sie hier:

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