Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wskazówki dotyczące korzystania z SQL Server z Salesforce

Spis treści

  1. Przegląd
  2. Klauzula GDZIE
  3. Wiele złączeń tabel
  4. Tabela lokalna dołączona do stołu zdalnego
  5. Wstawiaj, aktualizuj i usuwaj
  6. Aktualizacja
  7. Aktualizacja z parametrami
  8. Wstawianie nowego rekordu i otrzymywanie błędu BLOB
  9. Pobieranie identyfikatora Salesforce dla ostatniego wstawionego rekordu
  10. Aktualizowanie danych SQL Server po zmianie danych Salesforce
  11. Weryfikacja leniwego schematu
  12. Ograniczenia dostawcy OLEDB firmy Microsoft dla ODBC
  13. Jak znaleźć rekordy ze znakiem nowej linii (nowy wiersz) w adresie rozliczeniowym?
  14. Czy mogę zobaczyć, które stoły są dostępne w oprogramowaniu Easysoft?
  15. Czy mogę zobaczyć, które kolumny są dostępne w oprogramowaniu Easysoft?
  16. Czy mogę programowo utworzyć połączony serwer?

Przegląd

Ten dokument zawiera wskazówki dotyczące używania SQL Server z Salesforce. Komponenty używane do łączenia SQL Server z Salesforce to SQL Server Linked Server i sterownik Easysoft Salesforce ODBC. W tym artykule opisano sposób łączenia programu SQL Server z Salesforce. W przykładach w tym dokumencie użyta nazwa serwera połączonego (do której odwołujesz się w poleceniach SQL) to SF8.

Cały kod SQL w tym dokumencie został przetestowany pod kątem SQL Server 2017 i sterownika Easysoft Salesforce ODBC w wersjach 2.0.0 do 2.0.7.

Funkcje serwera SQL OPENQUERY i EXEC (EXECUTE ) zostały wprowadzone do SQL Server 2008 i te funkcje są kompatybilne ze wszystkimi wersjami SQL Server po 2008.

Napisaliśmy ten dokument w odpowiedzi na wiele zapytań otrzymanych przez nasz Zespół Wsparcia dotyczących połączenia SQL Server przez Easysoft z Salesforce. Jednak przykłady SQL powinny być również przydatne w przypadku połączeń z serwerem połączonym, które używają innego sterownika ODBC i zaplecza.

Jeśli chcesz przyczynić się do powstania tego dokumentu, wyślij swoje zgłoszenie pocztą elektroniczną na adres .

Klauzula GDZIE

Częstym problemem zgłaszanym do nas jest "Prosta klauzula WHERE zwraca tylko jeden wiersz". Na przykład:

wybierz identyfikator, imię, nazwisko z SF8.SF.DBO.Contact, gdzie Id='00346000002I95MAAS'

SQL Server konwertuje powyższe zapytanie i wysyła je do sterownika Salesforce ODBC:

wybierz identyfikator, imię, nazwisko z SF.DBO.Contact

Klauzula WHERE jest zawsze usuwana, co zmusza sterownik ODBC do zwrócenia wszystkich wierszy dla tej tabeli. Następnie SQL Server filtruje je lokalnie, aby uzyskać wymagane wiersze. Wydaje się, że nie ma znaczenia, jaką klauzulę WHERE określiłeś, nigdy nie jest ona przekazywana do sterownika ODBC.

Prostym rozwiązaniem jest użycie SQL Server OPENQUERY funkcja zamiast. Na przykład:

wybierz * z OPENQUERY(SF8,'wybierz identyfikator, imię, nazwisko z SF.DBO.Contact gdzie id=''00346000002I95MAAS'')

Cały kod SQL, który uruchamiasz w OPENQUERY funkcja jest przekazywana bezpośrednio do sterownika, w tym WHERE klauzula.

Wiele złączeń tabel

Oto proste połączenie dwóch stołów, w którym oba stoły wracają z połączonego serwera.

wybierz a.[Nazwa], BillingStreet, c.[Nazwa] z SF8.SF.DBO.Konto a, SF8.SF.DBO.Kontakt c, gdzie a.Id=c.Identyfikator konta i a.[Nazwa] jak „Zjednoczone%”

SQL Server wysyła następujące zapytania do sterownika ODBC.

wybierz * z kontawybierz * z kontaktu

SQL Server robi to, aby uzyskać listę nazw kolumn i typów danych. Następnie wysyła te zapytania do sterownika ODBC.

SELECT "Tbl1001"."Id" "Col1042","Tbl1001"."Nazwa" "Col1044","Tbl1001"."BillingStreet""Col1046"FROM "SF"."DBO"."Konto" "Tbl1001 " ZAMÓW WG "Col1042" ASCSELECT "Tbl1003"."Id konta" "Col1057","Tbl1003"."Nazwa" "Col1058" Z "SF"."DBO"."Kontakt" "Tbl1003" ZAMÓW WG "Col1057" ASC

Dane z obu zapytań są zwracane do tabel lokalnych, następnie klauzula WHERE jest umieszczana w tabeli Konto, a dane z obu tabel są łączone i zwracane.

Ponownie użycie OPENQUERY zapewnia, że ​​napisany przez Ciebie kod SQL zostanie przekazany bezpośrednio do sterownika ODBC, więc zamiast tego w SQL Server możesz uruchomić:

wybierz * z OPENQUERY(SF8,'wybierz a.[Nazwa], BillingStreet, c.[Nazwa] z SF.DBO.Konto a, SF.DBO.Kontakt c gdzie a.Id=c.Identyfikator konta i a. [Nazwa] jak „United%” ”)

Potrzebujesz niewielkiej modyfikacji, ponieważ SQL Server nie może obsłużyć wielu kolumn o tej samej „Nazwie”, więc musisz zmienić nazwę jednej z tych kolumn. Na przykład:

wybierz * z OPENQUERY(SF8,'wybierz a.[Nazwa], Ulica rozliczeniowa, c.[Nazwa] jako Imię i nazwisko z SF.DBO.Konto a, SF.DBO.Kontakt c gdzie a.Id=c.Identyfikator konta i a. [Nazwa] jak ''United%'' ')

Zmusza to sterownik ODBC do przetworzenia całego kodu SQL za jednym razem i zwrócenia tylko wymaganych wyników.

Tabela lokalna dołączona do stołu zdalnego

W tym przykładzie tabela lokalna została utworzona przez uruchomienie.

wybierz * w LocalAccount z SF8.SF.DBO.Account

Teraz wygląda połączenie dwóch tabel.

wybierz a.[Nazwa], Ulica rozliczeniowa, c.[Nazwa] jako Pełne imię i nazwisko z Konta lokalnego a, SF8.SF.DBO.Kontakt c, gdzie a.Id=c.Identyfikator konta i a.[Nazwa], np. „United%”

Powoduje to, że SQL Server wysyła następujące zapytanie trzy razy do sterownika ODBC.

wybierz * z Kontaktu

W co najmniej jednym z tych zapytań SQL Server prosi o wszystkie dane w tabeli. Następnie SQL Server pyta o:

SELECT „Tbl1003”. „Nazwa” „Kol1008” FROM „SF”. „DBO”. „Kontakt” „Tbl1003” WHERE ?="Tbl1003”. „Identyfikator konta”

SQL Server następnie przekazuje do sterownika ODBC listę identyfikatorów kont z tabeli LocalAccount zamiast znaku „?” parametr, w którym kolumna LocalAccount.[Name] odpowiada klauzuli LIKE.

Szybszym sposobem, w którym tabela ODBC jest drugą tabelą w zapytaniu, jest pobranie tylko potrzebnych kolumn z tabeli ODBC. Można to zrobić za pomocą OPENQUERY funkcjonować. Na przykład:

wybierz a.[Nazwa], Ulica rozliczeniowa, c.[Nazwa] jako Pełne imię i nazwisko z Konta lokalnego a, openquery(SF8, 'wybierz [Nazwa], Identyfikator konta z SF.DBO.Kontakt') c gdzie a.Id=c. AccountID i a.[Name], takie jak „United%”

Chociaż nadal pobiera wszystkie wiersze z tabeli Kontakt, pobiera tylko potrzebne kolumny i dlatego jest szybsze niż standardowe zapytanie.

Innym możliwym sposobem byłoby użycie kursora i tabeli tymczasowej. Na przykład:

Rozpocznij deklarację @AccountId jako varchar(20)deklaruj @SQL jako varchar(1024) — Utwórz tabelę tymczasową do przechowywania informacji o koncie. Sprawdzanie identyfikatora zapewnia, że ​​zwracane jest 0 wierszy danych select * do #LocalContact from openquery(SF8,'select [Name], AccountId from SF.DBO.Contact gdzie Id=''000000000000000000'' ') -- Ustaw deklarację kursora Kursor selcur do wyboru odrębnego identyfikatora z Konta Lokalnego, gdzie [Nazwa], np. „United%”, otwórz selcur, pobierz następny z selcur do @IdKonta, podczas gdy @@FETCH_STATUS=0 Rozpocznij wybór @SQL ='wstaw do #Kontakt lokalny wybierz [Nazwa], ''' +@Identyfikator Konta+''' z OPENQUERY(SF8,''wybierz [Nazwa] z Kontaktu, gdzie Identyfikator Konta=''''' + @Identyfikator Konta + ''''' '')' exec (@SQL) pobierz następny z selcur do @AccountId End close selcur deallocate selcur -- Następnie połącz tabele i wyświetl dane wybierz a.[Name], BillingStreet, c.[Name] jako FullName z LocalAccount a, #LocalContact c gdzie a.Id=c.AccountID i a. [Nazwa] jak 'United%' -- Nie zapomnij usunąć karty tymczasowej le upuść tabelę #LocalContact End

Ta metoda może być kilka razy szybsza niż OPENQUERY metoda pokazana w poprzednim przykładzie, jeśli klauzula WHERE przekazywana do sterownika Easysoft ODBC używa indeksu w Salesforce.

Wstaw, aktualizuj i usuń

Jeśli uruchamiasz zapytanie, które nie jest zapytaniem SELECT, najlepszym sposobem na to jest użycie SQL Server EXEC funkcjonować. Jeśli Twój połączony serwer nie może używać EXEC , otrzymasz komunikat podobny do:

Serwer 'SF8' nie jest skonfigurowany dla RPC.

Aby użyć EXEC , kliknij prawym przyciskiem myszy połączony serwer i wybierz właściwości. W sekcji „Opcje serwera” ustaw „Wyjście RPC” na „Prawda”. Następnie możesz użyć EXEC funkcja.

Aktualizuj

Załóżmy, że masz taką instrukcję w SQL Server:

UPDATE SF8.SF.DBO.Contact SET LastName='James' WHERE Id='0034600002I95MAAS'

SQL Server wysyła ten kod SQL do sterownika ODBC.

wybierz * z „SF”. „DBO”. „Kontakt”

Wszystkie rekordy są pobierane, a SQL Server wysyła tę instrukcję do sterownika ODBC.

AKTUALIZACJA „SF”. „DBO”. „Kontakt” SET „Nazwisko”=? GDZIE „Identyfikator”=? ORAZ „Nazwisko”=?

SQL Server robi to, aby upewnić się, że rekord nie zostanie zmieniony między uruchomieniem zapytania a wykonaniem UPDATE. Szybszą metodą jest użycie SQL Server EXEC funkcjonować. Na przykład:

exec ('zaktualizuj SF.DBO.Contact ustaw LastName=''James'' gdzie Id=''00346000002I95MAAS''') w SF8 

SQL Server wysyła sterownikowi ODBC cały wprowadzony ciąg, więc zapytanie jest wykonywane bez wybierania całej tabeli.

Aktualizacja z parametrami

Załóżmy, że masz:

Rozpocznij deklarację @Id varchar(20)='0034600002I95MAAS'deklaruj @LastName varchar(20)='Aktualizacja James'a SF8.SF.DBO.Contact set LastName=@LastName gdzie Id=@IdEnd

Działa to dokładnie w taki sam sposób, jak opisano w informacjach o aktualizacji. Jednak składnia przy użyciu EXEC zmiany funkcji:

Rozpocznij deklarację @Id varchar(20)='00346000002I95MAAS'deklaruj @LastName varchar(20)='James' exec ('update SF.DBO.Contact set LastName=? gdzie Id=?', @LastName, @Id ) w SF8End

Gdzie masz kolumnę, taką jak LastName= umieściłeś ? zamiast @LastName do reprezentowania tego, co zamierzasz przekazać do parametru. Parametry są następnie wyświetlane po instrukcji UPDATE w kolejności, w jakiej należy je odczytać.

Wstawianie nowego rekordu i pojawianie się błędu BLOB

Załóżmy, że próbujesz biegać:

wstaw do wartości SF8.SF.DBO.Contact (Imię, Nazwisko) („Easysoft”, „Test”)

SQL Server wysyła to do sterownika ODBC:

wybierz * z „SF”. „DBO”. „Kontakt”

Odbywa się to dwukrotnie. Przy pierwszym uruchomieniu SQL Server sprawdza, czy można zaktualizować zestaw wyników. Przy drugim wysłaniu SQL Server przechodzi do pustego rekordu po zwróceniu ostatniego rekordu i próbuje wykonać pozycyjną INSERT, co powoduje błąd.

Dostawca OLE DB "MSDASQL" dla połączonego serwera "SF8" zwrócił komunikat "Wstawianie lub aktualizowanie wartości BLOB w oparciu o zapytania nie jest obsługiwane."

Ten komunikat jest zwracany, ponieważ wstawka pozycyjna próbuje wstawić wszystkie kolumny z wartościami NULL z wyjątkiem tych, które określiłeś w instrukcji INSERT, a w przypadku tabeli Kontakt istnieje BLOB (obszar długiego tekstu w Salesforce ), których dostawca OLE DB firmy Microsoft nie obsługuje. Sterownik Easysoft Salesforce ODBC obsługuje wstawianie wszystkich pól w Salesforce, w których masz uprawnienia do wstawiania danych. Aby to obejść, wystarczy użyć EXEC.

exec („wstaw do SF.DBO.Contact (Imię, Nazwisko) wartości („Easysoft”, „Test”)) w SF8

To po prostu wysyła INSERT bezpośrednio do sterownika ODBC.

Pobieranie identyfikatora Salesforce dla ostatniego wstawionego rekordu

Kilku naszych klientów zapytało nas, jaka jest najłatwiejsza metoda uzyskania identyfikatora właśnie wstawionego wiersza. Ten przykład pokazuje, jak uzyskać identyfikator ostatniego rekordu wstawionego do tabeli „Kontakt”.

Rozpocznij zadeklaruj @Id varchar(20)='0034600002I95MAAS' zadeklaruj @FirstName varchar(20)='Easysoft' zadeklaruj @LastName varchar(20)='Test' zadeklaruj @FindTS varchar(22)=konwertuj(varchar(22) ),GETUTCDATE(),120) zadeklaruj @SQL jako varchar(1024) exec ('wstaw do wartości SF.DBO.Contact (FirstName, LastName ) (?, ?)', @FirstName, @LastName ) w SF8 wybierz @SQL ='select Id from openquery(SF8, ''select top 1 c.Id from [User] u, Contact c gdzie u.Username=CURRENT_USER i c.CreatedDate>={ts '''''+@FindTS+''' ''} i kolejność c.CreatedById=u.Id według c.CreatedDate desc'')' exec (@SQL) Koniec

Gdy rekord jest tworzony w Salesforce, kolumna „CreatedDate” zawiera znacznik czasu, czyli czas UTC (uniwersalny czas koordynowany), w którym rekord został utworzony, a niekoniecznie aktualną datę/godzinę. @FindTs ciąg jest ustawiany na UTC przed wykonaniem INSERT, więc po wywołaniu SELECT w celu uzyskania identyfikatora patrzy tylko na wiersze wstawione po @FindTS został ustawiony.

Podczas SELECT Easysoft CURRENT_USER funkcja służy również do ograniczenia wierszy zwracanych z Salesforce tylko do użytkownika, który wstawił dane.

Aktualizowanie danych SQL Server po zmianie danych Salesforce

Ta sekcja pokazuje, jak utworzyć nową tabelę SQL Server w oparciu o strukturę tabeli Salesforce i zaktualizować tę tabelę, gdy nastąpią zmiany w tej tabeli Salesforce.

utwórz procedurę SFMakeLocal( @Link varchar(50), @Remote varchar(50), @Local varchar(50), @DropLocal int) as define @SQL as nvarchar(max) begin /* Importuje dane do lokalnego table */ /* Ustaw DropLocal na 1, aby usunąć lokalną tabelę, jeśli istnieje */ if OBJECT_ID(@Local, 'U') NIE JEST NULL begin if (@DropLocal=1) begin set @SQL='DROP TABLE dbo. '+@Local exec ( @SQL) end else RAISERROR(15600,1,1, 'Tabela lokalna już istnieje') RETURN koniec set @SQL='wybierz * do dbo.'+@Local+' z OPENQUERY('+@Link+ ',''select * z '+@Remote+''')' exec(@SQL) select 'Tabela lokalna :'+@Local+' utworzona.' end -- @Link Your SQL Server linked server -- @Remote Nazwa tabeli w Salesforce -- @Local Lokalna tabela, w której chcesz przechowywać dane -- @DropLocal Ustaw na 1, jeśli tabela istnieje i chcesz upuścić to

Uruchom procedurę kopiowania struktury rekordów z tabeli Salesforce do tabeli lokalnej, a następnie przenieś wszystkie dane Salesforce. To przykładowe polecenie używa tabeli Konto. Ten proces może zająć trochę czasu, w zależności od ilości danych w tabeli Salesforce.

SFMakeLocal „SF8”, „Konto”, „Konto lokalne”, 0

Argumenty to:

Argument Wartość
SF8 Nazwa połączonego serwera SQL Server.
Konto Nazwa tabeli Salesforce, z której chcesz odczytać strukturę i dane.
KontoLokalne Nazwa Twojej tabeli w SQL Server.
0 Tę wartość domyślną można zmienić na 1, jeśli dodasz więcej niestandardowych kolumn do Salesforce i chcesz usunąć lokalną tabelę, aby utworzyć ją ponownie z nowymi kolumnami.

Następnym krokiem jest utworzenie dwóch dodatkowych procedur, które zaktualizują tabelę lokalną, jeśli jakiekolwiek dane zostaną zaktualizowane lub wstawione do tabeli Salesforce:

utwórz procedurę SFUpdateTable ( @Link varchar(50), @Remote varchar(50), utwórz procedurę SFUpdateTable @Link varchar(50), @Remote varchar(50), @LocalTable varchar(50) as begin -- Aktualizuje dane do lokalnej tabeli na podstawie zmian w Salesforce.declare @TempDef as varchar(50)='##EasyTMP_'deklaracja @TempName jako varchar(50) 100 define @MaxCreated jako datetimedeclare @MaxModified jako datetimedeklaracja @SQL jako nvarchar(max)deklaracja @RC as int -- Pierwszym krokiem jest utworzenie globalnej tabeli tymczasowej set @TempNumber=datepart(yyyy,@CTS)*10000000000 +datapart(mm,@CTS)*100000000+datapart(dd,@CTS)*1000000+datapart(hh,@CTS)*10000+datapart(mi,@CTS)*100+datapart(ss,@CTS) ustawiona @ TempName=@TempDef+cast(@TempNumber jako varchar(14)) while OBJECT_ID(@TempName, 'U') NIE JEST NULL begin RAISERROR (15600,1,1, 'Temp name jest już w użyciu.') RETURN end set @SQL='wybierz * do '+@TempName+' z '+@ LocalTable+' gdzie 1=0' utwórz tabelę #LocalDates ( ColName varchar(20), DTS datetime) ustaw @sql='insert in #LocalDates wybierz 'Created', max(CreatedDate) z '+@LocalTable exec (@sql ) set @sql='insert in #LocalDates select ''Modified'', max(LastModifiedDate) z '+@LocalTable exec (@sql) select @MaxCreated=DTS z #LocalDates gdzie ColName='Utworzony' select @MaxModified=DTS from #LocalDates gdzie ColName='Zmodyfikowane' upuść tabelę #LocalDates ustaw @SQL='wybierz * do '+@TempName+' z openquery('+@Link+',''wybierz * z '+@Remote+' gdzie CreatedDate>{ts ''''''+convert(varchar(22),@MaxCreated,120)+'''''}'')' exec(@SQL) exec SFAppe ndFromTemp @LocalTable, @TempName set @SQL='upuść tabelę '+@TempName exec (@SQL) set @SQL='wybierz * do '+@TempName+' z openquery('+@Link+',''wybierz * z ' +@Remote+' gdzie LastModifiedDate>{ts'''''+convert(varchar(22),@MaxModified,120)+'''''} i CreatedDate<={ts'''''+convert(varchar( 22),@MaxCreated,120)+'''''}'')' exec (@SQL) exec SFAppendFromTemp @LocalTable, @TempName set @SQL='upuść tabelę '+@TempName exec (@SQL) zakończ procedurę tworzenia SFAppendFromTemp(@Local varchar(50), @TempName varchar(50)) as begin /* Używa tabeli tymczasowej do importowania danych do tabeli lokalnej, upewniając się, że wszelkie duplikaty są najpierw usuwane */ define @Columns nvarchar(max) define @ ColName varchar(50) zadeklaruj @SQL nvarchar(max) ustaw @sql='usuń z '+@Local+' gdzie identyfikator w (wybierz identyfikator z '+@TempName+')' exec (@SQL) set @Columns='' zadeklaruj kursor col_cursor do wyboru syscolumns.name z sysobjects łączenie wewnętrzne syscolumns na sysobjects.id =syscolumns.id gdzie sysobjects.xtype ='u' i sysobjects.name =@Local open col_cursor pobierz następny z col_cursor do @ ColName while @@FETCH_STATUS=0 Begin set @Columns=@Columns+'['+@ColName+']' pobierz następny z col_cursor do @ColName if (@@FETCH_STATUS=0) set @Columns=@Columns+', ' Koniec zamknij col_cursor deallocate col_cursor set @sql='insert into '+@Local+' ('+@Columns+') select '+@Columns+' od '+@TempName exec (@sql) end -- Do pobrania danych z zdalny stół. 1) SFUpdateTable, który -- kopiuje dane do tabeli tymczasowej. 2) SFAppendFromTemp, który dołącza -- dane z tabeli tymczasowej do tabeli lokalnej. -- @Link Your SQL Server linked server name -- @Remote Nazwa tabeli w Salesforce -- @Local Lokalna tabela, w której chcesz przechowywać dane -- @TempName Nazwa tabeli, której można użyć do tymczasowego przechowywania danych. Nie -- używaj rzeczywistej nazwy tabeli tymczasowej, takiej jak #temp, to nie zadziała.

Aby to przetestować, uruchom:

SFUpdateTable „SF8”, „Konto”, „Konto lokalne”

Ten przykład może być użyty z dowolną tabelą Salesforce, do której użytkownik ma dostęp.

Weryfikacja leniwego schematu

We właściwościach serwera połączonego programu SQL Server w sekcji „Opcje serwera” znajduje się opcja „Sprawdzanie z opóźnieniem schematu”. Domyślnie jest to ustawione na FALSE, co powoduje, że SQL Server wysyła dwukrotnie instrukcje SELECT. Gdy zapytanie jest wysyłane po raz pierwszy, SQL Server wykorzystuje przekazane z powrotem szczegóły do ​​zbudowania metadanych dotyczących zestawu wyników. Następnie zapytanie jest wysyłane ponownie. Jest to dość kosztowne obciążenie, więc Easysoft zaleca ustawienie „Lazy Schema Validation” na TRUE, co oznacza, że ​​wysyłane jest tylko jedno zapytanie, pobierając zarówno metadane, jak i zestaw wyników za jednym razem. Oszczędza to również liczbę wykonywanych wywołań interfejsu Salesforce API.

Ograniczenia Microsoft OLEDB dla dostawcy ODBC

Szczegółowe informacje na temat ograniczeń dostawcy OLEDB dla ODBC można znaleźć pod adresem:

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

Jak znaleźć rekordy ze znakiem nowego wiersza (nowy wiersz) w adresie rozliczeniowym?

Korzystając z niektórych wewnętrznych funkcji sterownika Easysoft, można łatwo znaleźć rekordy, w których adres rozliczeniowy ma wysuw linii w rekordzie. Na przykład:

select * from openquery(sf8,'select Id, Name, {fn POSITION({fn CHAR(10)} IN BillingStreet)} LinePos from Account where {fn POSITION({fn CHAR(10)} IN BillingStreet)} >0')

POSITION(x) Ta funkcja szuka pozycji x wewnątrz określonej kolumny.

CHAR(X) Ta funkcja zwraca znak o wartości ASCII x .

Więcej informacji o funkcjach dostępnych w naszym sterowniku Salesforce ODBC można znaleźć tutaj

Czy mogę zobaczyć, które stoły są dostępne w oprogramowaniu Easysoft?

Aby uzyskać listę tabel, do których masz dostęp, uruchom:

select * from openquery(SF8,'select TABLE_NAME from INFO_SCHEMA.TABLES')

Czy mogę zobaczyć, które kolumny są dostępne w oprogramowaniu Easysoft?

Listę kolumn znajdujących się w tabeli można uzyskać, uruchamiając:

wybierz * z openquery(SF8,'wybierz * z INFO_SCHEMA.COLUMNS gdzie TABLE_NAME=''Konto''')

Korzystając z tej metody, można uzyskać tylko listę kolumn należących do tabeli określonej w klauzuli TABLE_NAME WHERE. Jeśli chcesz zobaczyć pełną listę kolumn dla wszystkich tabel, uruchom:

zacznij zadeklarować @Table nvarchar(max) zadeklaruj kursor table_cursor do wyboru TABLE_NAME z openquery(SF8, 'wybierz TABLE_NAME z INFO_SCHEMA.TABLES') otwórz table_cursor pobierz następny z table_cursor do @Table while @@FETCH_STATUS=0 Rozpocznij wykonywanie (' wybierz * z INFO_SCHEMA.COLUMNS gdzie TABLE_NAME=?', @Table) w SF8 pobierz dalej z table_cursor do @Table End zamknij table_cursor cofnij alokację table_cursorend

Czy mogę programowo utworzyć połączony serwer?

Tak. W sieci jest wiele przykładów, na przykład:

http://www.sqlservercentral.com/articles/Linked+Servers/142270/?utm_source=SSC


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekazać parametry wartości tabeli do procedury składowanej z kodu .net?

  2. Sekwencja a tożsamość

  3. Jak generować instrukcje wstawiania z danych programu Excel i ładować do tabeli programu SQL Server — samouczek SQL Server / TSQL, część 103

  4. Wybierz dane za pomocą funkcji wartościującej tabelę w SQL Server

  5. Jaki jest najlepszy sposób przechowywania współrzędnych (długość/szerokość geograficzna, z Google Maps) w SQL Server?