Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Parametry dla odbc.DataSource

Funkcja Odbc.DataSource przyjmuje dwa parametry — connectionString dla sterownika i options rekord, który umożliwia zastąpienie różnych zachowań sterowników. Za pomocą rekordu opcji można zastąpić możliwości i inne informacje zgłaszane przez sterownik, kontrolować zachowanie nawigatora i wpływać na zapytania SQL generowane przez aparat M.

Pola obsługiwanych opcji dzielą się na dwie kategorie — te, które są publiczne i zawsze dostępne, oraz te, które są dostępne tylko w kontekście rozszerzalności.

W poniższej tabeli opisano pola publiczne w rekordzie opcji.

Pole opis
CommandTimeout Wartość czasu trwania, która kontroluje, jak długo zapytanie po stronie serwera może być uruchamiane przed jego anulowaniem.

Ustawienie domyślne: 10 minut
ConnectionTimeout Wartość czasu trwania, która kontroluje czas oczekiwania przed porzuceniem próby nawiązania połączenia z serwerem.

Ustawienie domyślne: 15 sekund
CreateNavigationProperties Wartość logiczna określająca, czy generować właściwości nawigacji w zwracanych tabelach. Właściwości nawigacji są oparte na relacjach kluczy obcych zgłoszonych przez sterownik. Te właściwości są wyświetlane jako "wirtualne" kolumny, które można rozwinąć w edytorze zapytań, tworząc odpowiednie sprzężenia.

Jeśli obliczanie zależności klucza obcego jest kosztowną operacją dla sterownika, możesz ustawić tę wartość na false.

Domyślnie: true.
HierarchicalNavigation Wartość logiczna określająca, czy wyświetlać tabele pogrupowane według ich nazw schematów. Po ustawieniu wartości false tabele są wyświetlane na płaskiej liście w każdej bazie danych.

Domyślna: false
SqlCompatibleWindowsAuth Wartość logiczna określająca, czy program SQL Server ma być zgodny parametry połączenia podczas korzystania z uwierzytelniania systemu Windows —Trusted_Connection=Yes .

Jeśli sterownik obsługuje uwierzytelnianie systemu Windows, ale wymaga dodatkowych lub alternatywnych ustawień w parametry połączenia, należy ustawić tę wartość na false i użyć pola rekordu CredentialConnectionString opcji opisanego w następnej tabeli.

Domyślnie: true.

W poniższej tabeli opisano pola rekordów opcji, które są dostępne tylko za pośrednictwem rozszerzalności. Pola, które nie są prostymi wartościami literału, są opisane w kolejnych sekcjach.

Pole opis
AstVisitor Rekord zawierający co najmniej jedno przesłonięcia kontrolujące generowanie zapytań SQL. Najczęstszym użyciem tego pola jest zapewnienie logiki generowania klauzuli LIMIT/OFFSET dla sterowników, które nie obsługują top.

Pola obejmują Constant i LimitClause.

Więcej informacji: Zastępowanie usługi AstVisitor
CancelQueryExplicitly Wartość logiczna, która nakazuje aparatowi M jawne anulowanie wszystkich uruchomionych wywołań za pośrednictwem sterownika ODBC przed zakończeniem połączenia z serwerem ODBC.

To pole jest przydatne w sytuacjach, w których wykonywanie zapytań jest zarządzane niezależnie od połączeń sieciowych z serwerem, na przykład w niektórych wdrożeniach platformy Spark. W większości przypadków ta wartość nie musi być ustawiana, ponieważ zapytanie na serwerze jest anulowane po zakończeniu połączenia sieciowego z serwerem.

Domyślna: false
ClientConnectionPooling Wartość logiczna, która umożliwia buforowanie połączeń po stronie klienta dla sterownika ODBC. Większość sterowników będzie chciała ustawić tę wartość na true.

Domyślna: false
CredentialConnectionString Wartość tekstowa lub rekord używana do określania właściwości parametry połączenia związanych z poświadczeniami.
HideNativeQuery Wartość logiczna określająca, czy łącznik wyświetla wygenerowane instrukcje SQL w środowisku użytkownika dodatku Power Query. Należy ustawić wartość true tylko wtedy, gdy źródło danych zaplecza natywnie obsługuje program SQL-92.

Domyślna: false
ImplicitTypeConversions Wartość tabeli zawierająca niejawne konwersje typów obsługiwane przez sterownik lub serwer zaplecza. Wartości w tej tabeli są dodawane do konwersji zgłoszonych przez sam sterownik.

To pole jest zwykle używane z polem SQLGetTypeInfo podczas zastępowania informacji o typie danych zgłoszonych przez sterownik.
OnError Funkcja obsługi błędów, która odbiera errorRecord parametr typu record.

Typowe zastosowania tej funkcji obejmują obsługę błędów połączeń SSL, podanie linku pobierania, jeśli sterownik nie zostanie znaleziony w systemie i zgłaszanie błędów uwierzytelniania.
SoftNumbers Umożliwia aparatowi języka M wybranie zgodnego typu danych, gdy konwersja między dwoma określonymi typami liczbowymi nie jest zadeklarowana jako obsługiwana w funkcjach SQL_CONVERT_*.

Domyślna: false
SqlCapabilities Rekord zapewniający różne przesłonięcia możliwości sterownika oraz sposób określania możliwości, które nie są wyrażane za pośrednictwem odBC 3.8.

Więcej informacji: Zastępowanie elementów SqlCapabilities
SQLColumns Funkcja, która umożliwia modyfikowanie metadanych kolumn zwracanych przez SQLColumns funkcję.

Więcej informacji: Zastępowanie kolumn SQLColumns
SQLGetFunctions Rekord, który umożliwia zastąpienie wartości zwracanych przez wywołania metody SQLGetFunctions.

Typowym zastosowaniem tego pola jest wyłączenie użycia powiązania parametrów lub określenie, że wygenerowane zapytania powinny używać funkcji CAST, a nie KONWERTUJ.

Więcej informacji: Zastępowanie funkcji SQLGetFunctions
SQLGetInfo Rekord, który umożliwia zastąpienie wartości zwracanych przez wywołania metody SQLGetInfo.

Więcej informacji: Zastępowanie polecenia SQLGetInfo
SQLGetTypeInfo Tabela lub funkcja zwracająca tabelę, która zastępuje informacje o typie zwracane przez SQLGetTypeInfo.

Gdy wartość jest ustawiona na tabelę, wartość całkowicie zastępuje informacje o typie zgłaszane przez sterownik. SQLGetTypeInfo nie zostanie wywołana.

Gdy wartość jest ustawiona na funkcję, funkcja otrzyma wynik oryginalnego wywołania metody SQLGetTypeInfo, co umożliwi zmodyfikowanie tabeli.

To pole jest zwykle używane w przypadku niezgodności między typami danych zgłoszonymi przez SQLGetTypeInfo i SQLColumns.

Więcej informacji: Zastępowanie elementu SQLGetTypeInfo
SQLTables Funkcja, która umożliwia modyfikowanie metadanych tabeli zwracanych przez wywołanie metody SQLTables.
TolerateConcatOverflow Umożliwia łączenie wartości tekstowych, nawet jeśli wynik może zostać obcięty w zakresie dostępnego typu.

Na przykład w przypadku łączenia pola VARCHAR(4000) z polem VARCHAR(4000) w systemie obsługującym maksymalizowanie rozmiaru VARCHAR 4000 i bez typu CLOB łączenie jest składane, mimo że wynik może zostać obcięty.

Domyślna: false
UseEmbeddedDriver (użycie wewnętrzne): wartość logiczna określająca, czy sterownik ODBC powinien zostać załadowany z katalogu lokalnego (przy użyciu nowych funkcji zdefiniowanych w specyfikacji ODBC 4.0). Ta wartość jest zazwyczaj ustawiana tylko przez łączniki utworzone przez firmę Microsoft, które są dostarczane za pomocą dodatku Power Query.

W przypadku ustawienia wartości false system menedżer sterowników ODBC jest używany do lokalizowania i ładowania sterownika.

Większość łączników nie powinna wymagać ustawienia tego pola.

Domyślna: false

Zastępowanie obiektu AstVisitor

Pole AstVisitor jest ustawiane za pomocą rekordu opcji Odbc.DataSource . Służy do modyfikowania instrukcji SQL generowanych dla określonych scenariuszy zapytań.

Uwaga

Sterowniki obsługujące klauzule LIMIT i OFFSET (a nie TOP) będą chciały podać LimitClause przesłonięcia dla elementu AstVisitor.

Stała

Podanie zastąpienia tej wartości zostało przestarzałe i może zostać usunięte z przyszłych implementacji.

LimitClause

To pole jest funkcją, która odbiera dwa Int64.Type argumenty (skip, take), i zwraca rekord z dwoma polami tekstowymi (Text, Location).

LimitClause = (skip as nullable number, take as number) as record => ...

Parametr skip jest liczbą wierszy do pominięcia (czyli argumentem przesunięcia). Jeśli przesunięcie nie zostanie określone, wartość pominięcia będzie mieć wartość null. Jeśli sterownik obsługuje limit, ale nie obsługuje funkcji OFFSET, LimitClause funkcja powinna zwrócić nieimplementowany błąd (...) po przekroczeniu limitu 0.

Parametr take jest liczbą wierszy do wykonania (czyli argumentem limitu).

Pole Text wyniku zawiera tekst SQL, który ma zostać dodany do wygenerowanego zapytania.

Pole Location określa, gdzie należy wstawić klauzulę. W poniższej tabeli opisano obsługiwane wartości.

Wartość Opis Przykład
AfterQuerySpecification Klauzula LIMIT jest umieszczana na końcu wygenerowanego kodu SQL.

Jest to najczęściej obsługiwana składnia LIMIT.
SELECT a, b, c

TABELA FROM

> GDZIE 10

LIMIT 5
BeforeQuerySpecification Klauzula LIMIT jest umieszczana przed wygenerowaną instrukcją SQL. OGRANICZ 5 WIERSZY

SELECT a, b, c

TABELA FROM

> GDZIE 10
AfterSelect Limit przechodzi po instrukcji SELECT i po wszelkich modyfikatorach (takich jak DISTINCT). SELECT DISTINCT LIMIT 5 a, b, c

TABELA FROM

> GDZIE 10
AfterSelectBeforeModifiers Limit przechodzi po instrukcji SELECT, ale przed wszelkimi modyfikatorami (takimi jak DISTINCT). SELECT LIMIT 5 DISTINCT a, b, c

TABELA FROM

> GDZIE 10

Poniższy fragment kodu zawiera implementację LimitClause dla sterownika, który oczekuje klauzuli LIMIT z opcjonalnym przesunięciem w następującym formacie: [OFFSET <offset> ROWS] LIMIT <row_count>

LimitClause = (skip, take) =>
    let
        offset = if (skip > 0) then Text.Format("OFFSET #{0} ROWS", {skip}) else "",
        limit = if (take <> null) then Text.Format("LIMIT #{0}", {take}) else ""
    in
        [
            Text = Text.Format("#{0} #{1}", {offset, limit}),
            Location = "AfterQuerySpecification"
        ]

Poniższy fragment kodu zawiera implementację sterownika obsługującego LimitClause limit, ale nie OFFSET. Format: LIMIT <row_count>.

LimitClause = (skip, take) =>
    if (skip > 0) then error "Skip/Offset not supported"
    else
    [
        Text = Text.Format("LIMIT #{0}", {take}),
        Location = "AfterQuerySpecification"
    ]

Zastępowanie elementów SqlCapabilities

Pole Szczegóły
FractionalSecondsScale Wartość liczbowa z zakresu od 1 do 7, która wskazuje liczbę miejsc dziesiętnych obsługiwanych dla wartości milisekundowych. Ta wartość powinna być ustawiana przez łączniki, które chcą włączyć składanie zapytań w porównaniu z wartościami daty/godziny.

Ustawienie domyślne: null
PrepareStatements Wartość logiczna wskazująca, że instrukcje powinny być przygotowane przy użyciu narzędzia SQLPrepare.

Domyślna: false
SupportsTop Wartość logiczna wskazująca, że sterownik obsługuje klauzulę TOP, aby ograniczyć liczbę zwracanych wierszy.

Domyślna: false
StringLiteralEscapeCharacters Lista wartości tekstowych określających znaki do użycia podczas ucieczki literałów ciągu i wyrażeń LIKE.

Przykład: {""}

Ustawienie domyślne: null
SupportsDerivedTable Wartość logiczna wskazująca, że sterownik obsługuje tabele pochodne (wybór podrzędny).

Przyjmuje się, że ta wartość ma wartość true dla sterowników, które ustawiają ich poziom zgodności na SQL_SC_SQL92_FULL (zgłoszone przez sterownik lub zastąpione ustawieniem Sql92Conformance. Dla wszystkich innych poziomów zgodności ta wartość jest domyślnie ustawiona na false.

Jeśli sterownik nie zgłasza poziomu zgodności SQL_SC_SQL92_FULL, ale obsługuje tabele pochodne, ustaw tę wartość na true.

Obsługa tabel pochodnych jest wymagana w przypadku wielu scenariuszy trybu DirectQuery.
SupportsNumericLiterals Wartość logiczna wskazująca, czy wygenerowany kod SQL powinien zawierać wartości literałów liczbowych. W przypadku ustawienia wartości false wartości liczbowe są zawsze określane przy użyciu powiązania parametrów.

Domyślna: false
SupportsStringLiterals Wartość logiczna wskazująca, czy wygenerowany język SQL powinien zawierać wartości literałów ciągu. W przypadku ustawienia wartości false wartości ciągu są zawsze określane przy użyciu powiązania parametrów.

Domyślna: false
SupportsOdbcDateLiterals Wartość logiczna wskazująca, czy wygenerowany program SQL powinien zawierać wartości literałów daty. W przypadku ustawienia wartości false wartości daty są zawsze określane przy użyciu powiązania parametrów.

Domyślna: false
SupportsOdbcTimeLiterals Wartość logiczna wskazująca, czy wygenerowany program SQL powinien zawierać wartości literałów czasu. W przypadku ustawienia wartości false wartości czasu są zawsze określane przy użyciu powiązania parametrów.

Domyślna: false
SupportsOdbcTimestampLiterals Wartość logiczna wskazująca, czy wygenerowany program SQL powinien zawierać wartości literałów sygnatury czasowej. W przypadku ustawienia wartości false wartości znacznika czasu są zawsze określane przy użyciu powiązania parametrów.

Domyślna: false

Zastępowanie kolumn SQL

SQLColumns to procedura obsługi funkcji, która odbiera wyniki wywołania ODBC do funkcji SQLColumns. Parametr źródłowy zawiera tabelę z informacjami o typie danych. To zastąpienie jest zwykle używane do naprawiania niezgodności typów danych między wywołaniami do SQLGetTypeInfo i SQLColumns.

Aby uzyskać szczegółowe informacje na temat formatu parametru tabeli źródłowej, przejdź do funkcji SQLColumns.

Zastępowanie funkcji SQLGetFunctions

To pole służy do zastępowania SQLFunctions wartości zwracanych przez sterownik ODBC. Zawiera rekord, którego nazwy pól są równe FunctionId stałe zdefiniowane dla funkcji ODBC SQLGetFunctions . Stałe liczbowe dla każdego z tych pól można znaleźć w specyfikacji ODBC.

Pole Szczegóły
SQL_CONVERT_FUNCTIONS Wskazuje, które funkcje są obsługiwane podczas konwersji typów. Domyślnie aparat M próbuje użyć funkcji CONVERT. Sterowniki, które preferują użycie funkcji CAST, mogą zastąpić tę wartość, aby zgłosić, że obsługiwana jest tylko SQL_FN_CVT_CAST (wartość liczbowa 0x2).
SQL_API_SQLBINDCOL Wartość logiczna (true/false), która wskazuje, czy aparat mashupu powinien używać interfejsu API SQLBindCol podczas pobierania danych. W przypadku ustawienia wartości false zamiast tego jest używana wartość SQLGetData .

Domyślna: false

Poniższy fragment kodu zawiera przykład jawnego poinformowania aparatu M o użyciu funkcji CAST, a nie KONWERTUJ.

SQLGetFunctions = [
    SQL_CONVERT_FUNCTIONS = 0x2 /* SQL_FN_CVT_CAST */
]

Zastępowanie informacji SQLGetInfo

To pole służy do zastępowania SQLGetInfo wartości zwracanych przez sterownik ODBC. Zawiera rekord, którego pola są nazwami równymi InfoType stałymi zdefiniowanymi dla funkcji ODBC SQLGetInfo . Stałe liczbowe dla każdego z tych pól można znaleźć w specyfikacji ODBC. Pełną listę zaznaczonych InfoTypes elementów można znaleźć w plikach śledzenia aparatu mashup.

Poniższa tabela zawiera często zastępowane SQLGetInfo właściwości:

Pole Szczegóły
SQL_SQL_CONFORMANCE Wartość całkowita wskazująca poziom sql-92 obsługiwany przez sterownik:

(1) SQL_SC_SQL92_ENTRY: zgodność z programem SQL-92 na poziomie wejścia.
(2) SQL_SC_FIPS127_2_TRANSITIONAL: zgodność ze standardem FIPS 127-2 na poziomie przejściowym.
(4) SQL_SC_ SQL92_INTERMEDIATE" Zgodne z programem SQL-92 na poziomie pośrednim.
(8) SQL_SC_SQL92_FULL: zgodność z pełnym poziomem SQL-92.

W scenariuszach dodatku Power Query łącznik jest używany w trybie tylko do odczytu. Większość sterowników chce zgłosić SQL_SC_SQL92_FULL poziom zgodności i zastąpić określone zachowanie generowania sql przy użyciu SQLGetInfo właściwości i SQLGetFunctions .
SQL_SQL92_PREDICATES Maska bitowa wyliczającą predykaty obsługiwane w instrukcji SELECT zgodnie z definicją w języku SQL-92.

Przejdź do SQL_SP_* stałych w specyfikacji ODBC.
SQL_AGGREGATE_FUNCTIONS Maska bitów wylicza obsługę funkcji agregacji.

SQL_AF_ALL
SQL_AF_AVG
SQL_AF_COUNT
SQL_AF_DISTINCT
SQL_AF_MAX
SQL_AF_MIN
SQL_AF_SUM

Przejdź do SQL_AF_* stałych w specyfikacji ODBC.
SQL_GROUP_BY Wartość całkowita określająca relację między kolumnami w klauzuli GROUP BY i niegregowanymi kolumnami na liście wyboru:

SQL_GB_COLLATE: Klauzula COLLATE można określić na końcu każdej kolumny grupowania.

SQL_GB_NOT_SUPPORTED: klauzule GROUP BY nie są obsługiwane.

SQL_GB_GROUP_BY_EQUALS_SELECT: klauzula GROUP BY musi zawierać wszystkie niegregowane kolumny na liście wyboru. Nie może zawierać żadnych innych kolumn. Na przykład WYBIERZ POZYCJĘ DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT (MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT(DEPT).

SQL_GB_GROUP_BY_CONTAINS_SELECT: Klauzula GROUP BY musi zawierać wszystkie niegregowane kolumny na liście wyboru. Może zawierać kolumny, które nie znajdują się na liście wyboru. Na przykład WYBIERZ POZYCJĘ DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT, AGE.

SQL_GB_NO_RELATION: kolumny w klauzuli GROUP BY i lista wyboru nie są powiązane. Znaczenie niegrupowanych, niegregowanych kolumn na liście wyboru jest zależne od źródła danych. Na przykład WYBIERZ POZYCJĘ DEPT, SALARY FROM EMPLOYEE GROUP BY DEPT, AGE., SELECT DEPT, SALARY FROM EMPLOYEE GROUP BY DEPT( DEPT, AGE).

Przejdź do SQL_GB_* stałych w specyfikacji ODBC.

Następująca funkcja pomocnika może służyć do tworzenia wartości maski bitów na podstawie listy wartości całkowitych:

Flags = (flags as list) =>
    let
        Loop = List.Generate(
                  ()=> [i = 0, Combined = 0],
                  each [i] < List.Count(flags),
                  each [i = [i]+1, Combined =*Number.BitwiseOr([Combined], flags{i})],
                  each [Combined]),
        Result = List.Last(Loop, 0)
    in
        Result;

Zastępowanie elementu SQLGetTypeInfo

SQLGetTypeInfo można określić na dwa sposoby:

  • Stała table wartość zawierająca te same informacje o typie co wywołanie ODBC do SQLGetTypeInfometody .
  • Funkcja, która akceptuje argument tabeli i zwraca tabelę. Argument zawiera oryginalne wyniki wywołania ODBC do SQLGetTypeInfo. Implementacja funkcji może modyfikować lub dodawać do tej tabeli.

Pierwsze podejście służy do całkowitego zastępowania wartości zwracanych przez sterownik ODBC. Drugie podejście jest używane, jeśli chcesz dodać lub zmodyfikować te wartości.

Aby uzyskać szczegółowe informacje o formacie parametru tabeli typów i oczekiwanej wartości zwracanej, przejdź do dokumentacji funkcji SQLGetTypeInfo.

SQLGetTypeInfo przy użyciu tabeli statycznej

Poniższy fragment kodu zawiera statyczną implementację programu SQLGetTypeInfo.

SQLGetTypeInfo = #table(
    { "TYPE_NAME",      "DATA_TYPE", "COLUMN_SIZE", "LITERAL_PREF", "LITERAL_SUFFIX", "CREATE_PARAS",           "NULLABLE", "CASE_SENSITIVE", "SEARCHABLE", "UNSIGNED_ATTRIBUTE", "FIXED_PREC_SCALE", "AUTO_UNIQUE_VALUE", "LOCAL_TYPE_NAME", "MINIMUM_SCALE", "MAXIMUM_SCALE", "SQL_DATA_TYPE", "SQL_DATETIME_SUB", "NUM_PREC_RADIX", "INTERNAL_PRECISION", "USER_DATA_TYPE" }, {

    { "char",           1,          65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "char",            null,            null,            -8,              null,               null,             0,                    0                }, 
    { "int8",           -5,         19,             "'",            "'",              null,                     1,          0,                2,            0,                    10,                 0,                   "int8",            0,               0,               -5,              null,               2,                0,                    0                },
    { "bit",            -7,         1,              "'",            "'",              null,                     1,          1,                3,            null,                 0,                  null,                "bit",             null,            null,            -7,              null,               null,             0,                    0                },
    { "bool",           -7,         1,              "'",            "'",              null,                     1,          1,                3,            null,                 0,                  null,                "bit",             null,            null,            -7,              null,               null,             0,                    0                },
    { "date",           9,          10,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "date",            null,            null,            9,               1,                  null,             0,                    0                }, 
    { "numeric",        3,          28,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "numeric",         0,               0,               2,               null,               10,               0,                    0                },
    { "float8",         8,          15,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "float8",          null,            null,            6,               null,               2,                0,                    0                },
    { "float8",         6,          17,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "float8",          null,            null,            6,               null,               2,                0,                    0                },
    { "uuid",           -11,        37,             null,           null,             null,                     1,          0,                2,            null,                 0,                  null,                "uuid",            null,            null,            -11,             null,               null,             0,                    0                },
    { "int4",           4,          10,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "int4",            0,               0,               4,               null,               2,                0,                    0                },
    { "text",           -1,         65535,          "'",            "'",              null,                     1,          1,                3,            null,                 0,                  null,                "text",            null,            null,            -10,             null,               null,             0,                    0                },
    { "lo",             -4,         255,            "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "lo",              null,            null,            -4,              null,               null,             0,                    0                }, 
    { "numeric",        2,          28,             null,           null,             "precision, scale",       1,          0,                2,            0,                    10,                 0,                   "numeric",         0,               6,               2,               null,               10,               0,                    0                },
    { "float4",         7,          9,              null,           null,             null,                     1,          0,                2,            0,                    10,                 0,                   "float4",          null,            null,            7,               null,               2,                0,                    0                }, 
    { "int2",           5,          19,             null,           null,             null,                     1,          0,                2,            0,                    10,                 0,                   "int2",            0,               0,               5,               null,               2,                0,                    0                }, 
    { "int2",           -6,         5,              null,           null,             null,                     1,          0,                2,            0,                    10,                 0,                   "int2",            0,               0,               5,               null,               2,                0,                    0                }, 
    { "timestamp",      11,         26,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "timestamp",       0,               38,              9,               3,                  null,             0,                    0                }, 
    { "date",           91,         10,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "date",            null,            null,            9,               1,                  null,             0,                    0                }, 
    { "timestamp",      93,         26,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "timestamp",       0,               38,              9,               3,                  null,             0,                    0                }, 
    { "bytea",          -3,         255,            "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "bytea",           null,            null,            -3,              null,               null,             0,                    0                }, 
    { "varchar",        12,         65535,          "'",            "'",              "max. length",            1,          0,                2,            null,                 0,                  null,                "varchar",         null,            null,           -9,               null,               null,             0,                    0                }, 
    { "char",           -8,         65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "char",            null,            null,           -8,               null,               null,             0,                    0                }, 
    { "text",           -10,        65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "text",            null,            null,           -10,              null,               null,             0,                    0                }, 
    { "varchar",        -9,         65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "varchar",         null,            null,           -9,               null,               null,             0,                    0                },
    { "bpchar",         -8,         65535,           "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "bpchar",          null,            null,            -9,               null,               null,            0,                    0                } }
);

SQLGetTypeInfo przy użyciu funkcji

Następujące fragmenty kodu dołączają bpchar typ do istniejących typów zwracanych przez sterownik.

SQLGetTypeInfo = (types as table) as table =>
   let
       newTypes = #table(
           {
               "TYPE_NAME",
               "DATA_TYPE",
               "COLUMN_SIZE",
               "LITERAL_PREF",
               "LITERAL_SUFFIX",
               "CREATE_PARAS",
               "NULLABLE",
               "CASE_SENSITIVE",
               "SEARCHABLE",
               "UNSIGNED_ATTRIBUTE",
               "FIXED_PREC_SCALE",
               "AUTO_UNIQUE_VALUE",
               "LOCAL_TYPE_NAME",
               "MINIMUM_SCALE",
               "MAXIMUM_SCALE",
               "SQL_DATA_TYPE",
               "SQL_DATETIME_SUB",
               "NUM_PREC_RADIX",
               "INTERNAL_PRECISION",
               "USER_DATA_TYPE"
            },
            // we add a new entry for each type we want to add
            {
                {
                    "bpchar",
                    -8,
                    65535,
                    "'",
                    "'",
                    "max. length",
                    1,
                    1,
                    3,
                    null,
                    0,
                    null,
                    "bpchar",
                    null,
                    null,
                    -9,
                    null,
                    null,
                    0,
                    0
                }
            }),
        append = Table.Combine({types, newTypes})
    in
        append;

Ustawianie parametry połączenia

Parametry połączenia dla sterownika ODBC jest ustawiany przy użyciu pierwszego argumentu funkcji Odbc.DataSource i Odbc.Query. Wartość może być tekstem lub rekordem M. W przypadku korzystania z rekordu każde pole w rekordzie stanie się właściwością w parametry połączenia. Wszystkie parametry połączenia wymagają Driver pola (lub DSN pola, jeśli użytkownicy muszą wstępnie skonfigurować nazwę DSN na poziomie systemu). Właściwości związane z poświadczeniami są ustawiane oddzielnie. Inne właściwości są specyficzne dla sterownika.

Poniższy fragment kodu przedstawia definicję nowej funkcji źródła danych, tworzenia rekordu ConnectionString i wywołania funkcji Odbc.DataSource .

[DataSource.Kind="SqlODBC", Publish="SqlODBC.Publish"]
shared SqlODBC.Contents = (server as text) =>
    let
        ConnectionString = [
            Driver = "SQL Server Native Client 11.0",
            Server = server,
            MultiSubnetFailover = "Yes",
            ApplicationIntent = "ReadOnly",
            APP = "PowerBICustomConnector"
        ],
        OdbcDatasource = Odbc.DataSource(ConnectionString)
    in
        OdbcDatasource;

Następne kroki