Índice
- Visão geral
- As consultas de seleção simples no SQL Server não funcionam
- Inserção de dados em massa usando o driver SOQL
- Atualizar e excluir o volume de consultas
- Suporte Transacional Easysoft
- Validação de esquema lento
- Limitações do provedor OLEDB da Microsoft para ODBC
Visão geral
Este documento fornece algumas dicas sobre como usar o SQL Server com o Salesforce. Os componentes usados para conectar o SQL Server ao Salesforce são um SQL Server Linked Server e o Easysoft Salesforce ODBC Driver. Como você conecta o SQL Server ao Salesforce é descrito neste artigo. Para os exemplos neste documento, o nome do Linked Server (que você faz referência em seus comandos SQL) usado é SFSOQL8.
Todo o SQL neste documento foi testado no SQL Server 2017 e no driver ODBC do Easysoft Salesforce versão 2.0.0.
Se você gostaria de contribuir para este documento, envie seu envio por e-mail para .
Consultas de seleção simples no SQL Server não funcionam
Digamos que você esteja tentando executar esta consulta no SQL Server:
SELECT Id FROM SFSOQL8...Account
O SQL Server converte esse SQL em:
SELECT "Tbl1002"."Id" "Col1004" FROM "Account" "Tbl1002"
Como a linguagem SOQL do Salesforce não suporta a renomeação de tabelas e colunas dessa forma, você acaba com este erro:
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".
O SQL Server tem dois métodos disponíveis para enviar SOQL para o driver Easysoft:
OPENQUERY
, que pode ser usado em conjunto com tabelas locais para unir dados remotos e locais.EXEC
que pode ser usado junto com parâmetros para executar diretamente seu SOQL no Salesforce.
Para demonstrar esses métodos, começaremos com uma junção de tabela SOQL:
SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity
No SQL Server, você pode executar uma das seguintes consultas:
SELECT * FROM OPENQUERY(SFSOQL8, 'SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity')
-Ou-
EXEC ('SELECT Id, Amount, Name, ( SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems ) FROM Opportunity') at SFSOQL8
Quase não há diferença no desempenho, pois o SOQL que você escreveu é passado diretamente para o servidor do Salesforce.
Da mesma forma, todas as funções SOQL também estão disponíveis usando os mesmos 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)')
Se você passar um SOQL inválido, o Easysoft SOQL Driver retornará o erro diretamente do Salesforce. Por exemplo:
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".
Mais informações sobre a linguagem SOQL podem ser encontradas aqui.
Inserção de dados em massa usando o driver SOQL
Dentro da API SOAP do Salesforce há uma função que permite inserir até 200 linhas de dados de uma única chamada de API SOAP. O driver ODBC SOQL do Easysoft Salesforce faz uso dessa função e permite que você use o SQL Server TSQL para carregar em massa até 200 linhas por vez.
No meu exemplo, adicionarei novos registros ao objeto Account no Salesforce. Este é um exemplo muito básico com apenas algumas colunas de dados, mas espero que isso explique como as inserções em massa são possíveis no SQL Server. No SQL Server, tenho uma tabela local chamada Account que se parece com:
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 lendo minha tabela de contas local em um cursor.
No início do primeiro bloco de 200 linhas, o
Begin Trans
é chamado, o que informa ao driver Easysoft que quaisquer dados passados a ele serão mantidos até que um Commit
ou um Rollback
é chamado. O
EXEC
A função envia cada linha encontrada no cursor para o driver Easysoft. O driver então cria a chamada de API SOAP necessária. Quando 200 linhas são enviadas para a Easysoft, eu envio um Commit
, que faz com que o driver envie a chamada da API SOAP para o Salesforce. Ao atingir o final do cursor, se houver algum registro enviado ao driver Easysoft que não tenha sido passado ao Salesforce, envio um
Commit
final . O cursor é então fechado e desalocado. O limite de 200 linhas é um limite interno no Salesforce. Se você tentar enviar mais de 200 linhas, receberá um erro do Salesforce. O driver Easysoft não possui limites integrados, portanto, se o Salesforce aumentar o limite de 200 linhas em versões futuras da API SOAP, o driver Easysoft funcionará automaticamente com o novo limite.
Ao usar esse método de inserção em massa, não há limite para o número de tabelas nas quais você pode inserir dados em um único bloco, portanto, o seguinte TSQL funcionará:
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
Ao usar o método Begin Trans/Commit para inserções, você só pode enviar instruções de inserção. Você não pode misturar e combinar inserções e atualizações, pois isso não é compatível com a API SOAP do Salesforce.
Atualizar e excluir o volume de consultas
Nosso driver SOQL possui um método integrado para transações de dados em massa, quando usado com uma consulta UPDATE ou DELETE.
Este exemplo mostra como atualizo uma coluna personalizada para um valor definido.
EXEC ('UPDATE Account SET CustomerPriority__c=''low'' WHERE CustomerPriority__c=NULL') at SFSOQL8
O Salesforce não oferece suporte a UPDATEs ou DELETEs usando SOQL, portanto, o driver Easysoft precisa converter a consulta em um SOQL SELECT. As linhas retornadas do SELECT são então agrupadas em blocos de até 200 e enviadas um bloco por vez para um UPDATE ou DELETE.
Suporte Transacional Easysoft
O Driver ODBC SOQL do Easysoft Salesforce suporta apenas um único nível de transação. Então, um
Begin Trans
seguido por alguns INSERTs podem ser enviados ao Salesforce com um COMMIT
ou jogado fora dentro do driver usando um ROLLBACK
. Validação de esquema lento
Nas propriedades do servidor vinculado do SQL Server, na seção "Opções do servidor", há uma opção para "Validação de esquema lento". Por padrão, isso é definido como FALSE, o que faz com que o SQL Server ao executar uma instrução SELECT envie a instrução duas vezes. Na primeira vez que ele é enviado, o SQL Server usa os detalhes passados de volta para construir os metadados sobre seu conjunto de resultados. Em seguida, a consulta é enviada novamente. Esta é uma sobrecarga bastante cara, então a Easysoft recomendaria que você defina "Lazy Schema Validation" como TRUE, o que significa que apenas um SELECT é enviado, que obtém os metadados e os dados. Isso também reduz o número de chamadas de API do Salesforce sendo feitas.
Limitações do OLEDB da Microsoft para Provedor ODBC
Detalhes sobre as limitações do OLEDB para ODBC Provider podem ser encontrados aqui:
https://msdn.microsoft.com/en-us/library/ms719628(v=vs.85).aspx