sql >> Databasteknik >  >> RDS >> Sqlserver

Tips för att använda SQL Server med Salesforce SOQL

Innehållsförteckning

  1. Översikt
  2. Simple Select Queries i SQL Server fungerar inte
  3. Massinsättning av data med SOQL-drivrutinen
  4. Uppdatera och ta bort frågebulk
  5. Easysoft Transactional Support
  6. Lazy Schema Validering
  7. Begränsningar för Microsofts OLEDB för ODBC-leverantör

Översikt

Det här dokumentet ger några tips om hur du använder SQL Server med Salesforce. Komponenterna som används för att ansluta SQL Server till Salesforce är en SQL Server Linked Server och Easysoft Salesforce ODBC Driver. Hur du ansluter SQL Server till Salesforce beskrivs i den här artikeln. För exemplen i detta dokument är det länkade servernamnet (som du refererar till i dina SQL-kommandon) som används SFSOQL8.

All SQL i det här dokumentet testades mot SQL Server 2017 och Easysoft Salesforce ODBC-drivrutin version 2.0.0.

Om du vill bidra till det här dokumentet, skicka ett e-postmeddelande till .

Simple Select Queries i SQL Server fungerar inte

Låt oss säga att du försöker köra den här frågan i SQL Server:

SELECT Id FROM SFSOQL8...Account

SQL Server konverterar den SQL till:

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

Eftersom Salesforce SOQL-språket inte stöder byte av tabeller och kolumner på det sättet, får du det här felet:

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 har två tillgängliga metoder för att skicka SOQL till Easysoft-drivrutinen:

  1. OPENQUERY , som kan användas tillsammans med lokala tabeller för att sammanfoga fjärr- och lokaldata.
  2. EXEC som kan användas tillsammans med parametrar för att direkt köra din SOQL mot Salesforce.

För att demonstrera dessa metoder börjar vi med en SOQL-tabellanslutning:

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

I SQL Server kan du köra någon av följande frågor:

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

—Eller—

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

Det är nästan ingen skillnad i prestanda eftersom SOQL du har skrivit skickas direkt till Salesforce-servern.

På samma sätt är alla SOQL-funktioner också tillgängliga med samma metoder:

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

Om du skickar in ogiltig SOQL kommer Easysoft SOQL-drivrutinen att returnera felet direkt från Salesforce. Till exempel:

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

Mer information om SOQL-språket finns här.

Massinfoga data med SOQL-drivrutinen

Inom Salesforce SOAP API finns en funktion som låter dig infoga upp till 200 rader med data från ett enda SOAP API-anrop. Easysoft Salesforce SOQL ODBC-drivrutinen använder sig av den här funktionen och låter dig använda SQL Server TSQL för att massladda upp till 200 rader åt gången.

I mitt exempel kommer jag att lägga till nya poster till kontoobjektet i Salesforce. Det här är ett väldigt enkelt exempel med bara ett fåtal kolumner med data, men jag hoppas att detta förklarar hur bulkinfogningar är möjliga från SQL Server. I SQL Server har jag en lokal tabell som heter Konto som ser ut så här:

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

Denna TSQL fungerar genom att läsa min lokala kontotabell till en markör.

I början av det första blocket med 200 rader visas Begin Trans anropas, vilket talar om för Easysoft-drivrutinen att all data som skickas till den kommer att lagras tills antingen en Commit eller en Rollback kallas.

EXEC funktionen skickar varje rad som finns i markören till Easysoft-drivrutinen. Drivrutinen bygger sedan upp det nödvändiga SOAP API-anropet. När 200 rader har skickats till Easysoft skickar jag en Commit , vilket gör att drivrutinen skickar SOAP API-anropet till Salesforce.

När slutet av markören nås, om det finns några poster som skickas till Easysoft-drivrutinen som inte har skickats till Salesforce, skickar jag en sista Commit . Markören stängs sedan och avallokeras.

Gränsen på 200 rader är en intern gräns inom Salesforce. Om du försöker skicka fler än 200 rader får du ett Salesforce-fel. Easysoft-drivrutinen har inga inbyggda gränser, så om Salesforce ökar gränsen på 200 rader i framtida versioner av SOAP API, kommer Easysoft-drivrutinen automatiskt att fungera med den nya gränsen.

När du använder denna massinsättningsmetod finns det ingen gräns för antalet tabeller du kan infoga data i i ett enda block, så följande TSQL kommer att fungera:

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

När du använder metoden Begin Trans/ Commit för inserts kan du bara skicka insert-satser. Du kan inte blanda och matcha inlägg och uppdateringar eftersom detta inte stöds i Salesforce SOAP API.

Uppdatera och ta bort frågemassa

Vår SOQL-drivrutin har en inbyggd metod för att samla datatransaktioner, när den används med en UPPDATERING eller en DELETE-fråga.

Det här exemplet visar hur jag uppdaterar en anpassad kolumn till ett inställt värde.

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

Salesforce stöder inte UPPDATERINGAR eller DELETEs med SOQL, så Easysoft-drivrutinen måste konvertera frågan till en SOQL SELECT. Raderna som returneras från SELECT samlas sedan upp i block med upp till 200 och skickas ett block åt gången för en UPPDATERING eller DELETE.

Easysoft Transactional Support

Easysoft Salesforce SOQL ODBC-drivrutinen stöder endast en transaktionsnivå. Så en Begin Trans följt av några INSERT kan skickas till Salesforce med en COMMIT eller kastas i föraren genom att använda en ROLLBACK .

Lazy Schema Validering

I din SQL Server-länkade serveregenskaper under avsnittet "Serveralternativ" finns ett alternativ för "Lazy Schema Validation". Som standard är detta inställt på FALSE vilket gör att SQL Server när du kör en SELECT-sats skickar satsen två gånger. Första gången den skickas använder SQL Server de uppgifter som skickas tillbaka för att bygga upp metadata om din resultatuppsättning. Sedan skickas frågan igen. Detta är en ganska dyr omkostnad, så Easysoft skulle rekommendera att du ställer in "Lazy Schema Validation" till TRUE, vilket innebär att endast en SELECT skickas, som får både metadata och data. Detta minskar också antalet Salesforce API-anrop som görs.

Begränsningar för Microsofts OLEDB för ODBC-leverantör

Detaljer om begränsningarna för OLEDB för ODBC-leverantör finns här:

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


  1. Hålla propagation alltid aktiverad i Oracle Streams

  2. När ska man använda enkla citattecken, dubbla citattecken och backticks i MySQL

  3. Hur ser man index för en databas eller tabell i MySQL?

  4. Hur man får gårdagens datum i MySQL