Parametre pre Odbc.DataSource

Funkcia Odbc.DataSource má dva parametre – connectionString a pre ovládač a options záznam, ktorý umožňuje prepísať rôzne správania vodiča. Pomocou záznamu možností môžete prepísať funkcie a ďalšie informácie, ktoré uvádza ovládač, ovládať správanie navigátora a ovplyvniť dotazy SQL vygenerované nástrojom M.

Polia podporovaných možností záznamov spadajú do dvoch kategórií – tie, ktoré sú verejné a vždy dostupné, a tie, ktoré sú k dispozícii len v kontexte rozšíriteľnosti.

Nasledujúca tabuľka popisuje verejné polia v zázname možností.

Pole Description
CommandTimeout Hodnota trvania, ktorá určuje, ako dlho má dotaz na strane servera povolené byť spustený, predtým ako sa zruší.

Predvolená hodnota: 10 minút
ConnectionTimeout Hodnota trvania, ktorá určuje, ako dlho sa má počkať, kým sa odmietne pokus o vytvorenie pripojenia na server.

Predvolená hodnota: 15 sekúnd
CreateNavigationProperties Logická hodnota, ktorá nastavuje, či sa majú generovať vlastnosti navigácie vo vrátených tabuľkách. Vlastnosti navigácie sú založené na vzťahoch cudzieho kľúča, ktoré uvádza ovládač. Tieto vlastnosti sa zobrazujú ako "virtuálne" stĺpce, ktoré je možné rozbaliť v editore dotazov a vytvoriť vhodné spojenie.

Ak výpočet závislostí cudzieho kľúča predstavuje pre váš ovládač náročnú operáciu, možno budete chcieť nastaviť túto hodnotu na hodnotu false.

Predvolená hodnota: true
HierarchicalNavigation Logická hodnota, ktorá nastavuje, či sa majú zobraziť tabuľky zoskupené podľa názvov schémy. Keď je nastavená hodnota false, tabuľky sa zobrazia v zjednodušenom zozname pod každou databázou.

Predvolená hodnota: False
SqlCompatibleWindowsAuth Logická hodnota, ktorá určuje, či sa má pri použití overovania systému Windows vyprodukovať reťazec pripojenia kompatibilný s SQL ServeromTrusted_Connection=Yes.

Ak váš ovládač podporuje overovanie systému Windows, ale vo vašom reťazec pripojenia vyžaduje dodatočné alebo alternatívne nastavenia, mali by ste túto hodnotu nastaviť na hodnotu false a použiť CredentialConnectionString pole záznamov možností popísané v nasledujúcej tabuľke.

Predvolená hodnota: true

Nasledujúca tabuľka popisuje polia záznamov možností, ktoré sú k dispozícii len prostredníctvom rozšíriteľnosti. Polia, ktoré nie sú jednoduché literálové hodnoty, sú popísané v ďalších sekciách.

Pole Description
AstVisitor Záznam obsahujúci jedno alebo viac prepísaní na riadenie generovania dotazu SQL. Najbežnejšie použitie tohto poľa je poskytnutie logiky na generovanie klauzuly LIMIT/OFFSET pre ovládače, ktoré nepodporujú funkciu TOP.

Polia zahŕňajú Constant a LimitClause.

Ďalšie informácie: Prepisovanie rozhrania AstVisitor
CancelQueryExplicitly Logická hodnota, ktorá dáva pokyn nástroju M, aby explicitne zrušil všetky spustené volania prostredníctvom ovládača ODBC pred ukončením pripojenia k serveru ODBC.

Toto pole je užitočné v situáciách, keď sa vykonanie dotazu spravuje nezávisle od sieťových pripojení k serveru, napríklad v niektorých nasadeniach služby Spark. Vo väčšine prípadov túto hodnotu nie je potrebné nastaviť, pretože po ukončení sieťového pripojenia k serveru sa dotaz na serveri zruší.

Predvolená hodnota: False
ClientConnectionPooling Logická hodnota, ktorá umožňuje združovanie pripojení na strane klienta pre ovládač ODBC. Väčšina vodičov bude chcieť nastaviť túto hodnotu na hodnotu true.

Predvolená hodnota: False
CredentialConnectionString Textová hodnota alebo hodnota záznamu, ktorá sa používa na špecifikáciu vlastností reťazec pripojenia súvisiacich s prihlasovacími povereniami.
HideNativeQuery Logická hodnota, ktorá určuje, či sa v konektore zobrazujú vygenerované príkazy SQL v používateľskom prostredí doplnku Power Query. Toto by malo byť nastavené na hodnotu true iba v prípade, že serverový zdroj údajov natívne podporuje SQL-92.

Predvolená hodnota: False
ImplicitTypeConversions Hodnota tabuľky obsahujúca implicitné konverzie typu podporované ovládačom alebo serverom backendu. Hodnoty v tejto tabuľke sa pripočítajú k konverziám hláseným samotným ovládačom.

Toto pole sa zvyčajne používa s poľom SQLGetTypeInfo pri prepisovaní informácií o type údajov hlásených vodičom.
OnError Funkcia spracovania chýb, ktorá prijíma errorRecord parameter typu record.

K bežnému použitiu tejto funkcie patrí spracovanie zlyhaní pripojenia SSL, poskytnutie prepojenia na stiahnutie v prípade, že sa v systéme nenájde ovládač a hlásenie chýb overovania.
SoftNumbers Umožňuje nástroju M vybrať kompatibilný typ údajov pri konverzii medzi dvomi konkrétnymi číselnými typmi, ktorá nie je deklarovaná ako podporovaná v možnostiach SQL_CONVERT_*.

Predvolená hodnota: False
SqlCapabilities Záznam, ktorý poskytuje rôzne prepísania možností ovládačov a spôsob na určenie možností, ktoré nie sú vyjadrené prostredníctvom rozhrania ODBC 3.8.

Ďalšie informácie: Prepisovanie funkcií SqlCapabilities
SQLColumns Funkcia, ktorá umožňuje upraviť metaúdaje stĺpca vrátené funkciou SQLColumns .

Ďalšie informácie: Prepísanie funkcie SQLColumns
SQLGetFunctions Záznam, ktorý umožňuje prepísať hodnoty vrátené volaniami do SQLGetFunctions.

Bežným použitím tohto poľa je zakázanie použitia väzby parametra alebo určenie, že vygenerované dotazy by mali používať funkciu CAST namiesto funkcie CONVERT.

Ďalšie informácie: Prepisovanie funkcií SQLGetFunctions
SQLGetInfo Záznam, ktorý umožňuje prepísať hodnoty vrátené volaniami do SQLGetInfo.

Ďalšie informácie: Prepísanie sqlGetInfo
SQLGetTypeInfo Tabuľka alebo funkcia, ktorá vráti tabuľku, ktorá prepíše informácie o type vrátené funkciou SQLGetTypeInfo.

Keď je hodnota nastavená na tabuľku, hodnota úplne nahradí informácie o type, ktoré uvádza ovládač. SQLGetTypeInfo nevolá sa .

Keď je hodnota nastavená na funkciu, funkcia dostane výsledok pôvodného volania na SQLGetTypeInfo, čo vám umožní upraviť tabuľku.

Toto pole sa zvyčajne používa v prípade, že existuje nesúlad medzi typmi údajov hlásenými v entite SQLGetTypeInfo a SQLColumns.

Ďalšie informácie: Prepísanie príkazu SQLGetTypeInfo
SQLTables Funkcia, ktorá umožňuje upraviť metaúdaje tabuľky vrátené volaním funkcie SQLTables.
TolerateConcatOverflow Umožňuje výskytu zreťazenia textových hodnôt dokonca aj vtedy, ak sa výsledok môže skrátiť tak, aby sa zmestil do rozsahu dostupného typu.

Napríklad pri zreťazení poľa VARCHAR(4000) s poľom VARCHAR(4000) v systéme, ktorý podporuje maximalizovanú veľkosť varchar 4000 a žiadny typ CLOB, zreťazenie sa zreťazí, aj keď sa výsledok môže skrátiť.

Predvolená hodnota: False
UseEmbeddedDriver (interné použitie): Logická hodnota, ktorá určuje, či sa má ovládač ODBC načítať z lokálneho adresára (pomocou novej funkcie definovanej v špecifikácii ODBC 4.0). Túto hodnotu zvyčajne nastavujú len konektory vytvorené spoločnosťou Microsoft, ktoré odosielaujú údaje pomocou doplnku Power Query.

Keď je nastavená hodnota false, na vyhľadanie a načítanie ovládača sa použije správca ovládačov ODBC systému.

Väčšina konektorov by toto pole nemala nastavovať.

Predvolená hodnota: False

Prepísanie aplikácie AstVisitor

Pole AstVisitor je nastavené prostredníctvom záznamu možností Odbc.DataSource . Používa sa na úpravu príkazov SQL vygenerovaných pre konkrétne scenáre dotazov.

Poznámka

Ovládače, ktoré podporujú klauzuly LIMIT a OFFSET (namiesto TOP), budú chcieť prepísať LimitClause .AstVisitor

Konštanta

Poskytnutie prepísanie pre túto hodnotu je zastarané a z budúcich implementácií môže byť odstránené.

LimitClause

Toto pole je funkciou, ktorá prijíma dva Int64.Type argumenty (skip, take) a vráti záznam s dvomi textovými poľami (Text, Location).

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

Parameter skip je počet riadkov, ktoré sa majú vynechať (to znamená argument na posun). Ak posun nie je zadaný, hodnota vynechania bude null. Ak váš ovládač podporuje funkciu LIMIT, ale nepodporuje funkciu OFFSET, LimitClause funkcia by mala vrátiť neimplementovanú chybu (...) pri preskočiť väčšiu ako 0.

Parameter take je počet riadkov, ktoré sa majú prijať (to znamená argument funkcie LIMIT).

Pole Text výsledku obsahuje text SQL, ktorý sa má pridať do vygenerovaného dotazu.

Pole Location určuje, kam sa má vložiť klauzula. Nasledujúca tabuľka popisuje podporované hodnoty.

Hodnota Description Príklad
AfterQuerySpecification Klauzula LIMIT sa nachádza na konci generovaného SQL.

Toto je najčastejšie podporovaná syntax LIMIT.
VYBERTE a, b, c

Z tabuľky

> KDE 10

LIMIT 5
BeforeQuerySpecification Klauzula LIMIT sa nachádza pred vygenerovaným príkazom SQL. OBMEDZTE POČET RIADKOV: 5

VYBERTE a, b, c

Z tabuľky

> KDE 10
AfterSelect Funkcia LIMIT nasleduje za príkazom SELECT a po všetkých modifikátoroch (napríklad DISTINCT). VYBERTE POLOŽKU DISTINCT LIMIT 5 a, b, c

Z tabuľky

> KDE 10
AfterSelectBeforeModifiers Funkcia LIMIT nasleduje za príkazom SELECT, ale pred akýmikoľvek modifikátormi (napríklad DISTINCT). VYBERTE LIMIT 5 DISTINCT a, b, c

Z tabuľky

> KDE 10

Nasledujúci úryvok kódu poskytuje implementáciu LimitClause pre ovládač, ktorý očakáva klauzulu LIMIT s voliteľnou službou OFFSET v nasledujúcom formáte: [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"
        ]

Nasledujúci zlomok kódu poskytuje implementáciu LimitClause pre ovládač, ktorý podporuje funkciu LIMIT, ale nie OFFSET. Formát: LIMIT <row_count>.

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

Prepisovanie funkcií SqlCapabilities

Pole Podrobnosti
FractionalSecondsScale Číselná hodnota v rozsahu od 1 do 7 udávajúceho počet desatinných miest podporovaných pre milisekundové hodnoty. Túto hodnotu majú nastaviť konektory, ktoré chcú povoliť skladanie dotazov v hodnotách typu datetime.

Predvolená hodnota: null
PrepareStatements Logická hodnota, ktorá označuje, že príkazy by mali byť pripravené pomocou funkcie SQLPrepare.

Predvolená hodnota: False
SupportsTop Logická hodnota, ktorá označuje, že ovládač podporuje klauzulu TOP na obmedzenie počtu vrátených riadkov.

Predvolená hodnota: False
StringLiteralEscapeCharacters Zoznam textových hodnôt, ktoré určujú znaky, ktoré sa majú použiť pri úteku pred literálmi reťazca a výrazmi LIKE.

Príklad: {""}

Predvolená hodnota: null
SupportsDerivedTable Logická hodnota, ktorá označuje, že ovládač podporuje odvodené tabuľky (čiastkové výbery).

Predpokladá sa, že táto hodnota je true pre ovládače, ktoré nastavujú úroveň ich zhody na SQL_SC_SQL92_FULL (ako uvádza ovládač alebo prepísaný nastavením Sql92Conformance. Pre všetky ostatné úrovne zhody je táto hodnota predvolene nastavená na hodnotu false.

Ak váš ovládač nenahlási úroveň súladu SQL_SC_SQL92_FULL, ale podporuje odvodené tabuľky, nastavte túto hodnotu na true.

Podpora odvodených tabuliek sa vyžaduje v prípade mnohých scenárov DirectQuery.
SupportsNumericLiterals Logická hodnota, ktorá udáva, či by vygenerovaný SQL mal obsahovať číselné hodnoty literálov. Keď je nastavená hodnota false, číselné hodnoty sa vždy zadávajú pomocou väzby parametra.

Predvolená hodnota: False
SupportsStringLiterals Logická hodnota, ktorá udáva, či by vygenerovaný SQL mal obsahovať hodnoty literálov reťazca. Pri nastavení na hodnotu false sa hodnoty reťazca vždy zadávajú pomocou väzby parametra.

Predvolená hodnota: False
SupportsOdbcDateLiterals Logická hodnota, ktorá udáva, či by vygenerovaný SQL mal obsahovať hodnoty dátumových literálov. Keď je nastavená hodnota false, dátumové hodnoty sa vždy zadávajú pomocou väzby parametra.

Predvolená hodnota: False
SupportsOdbcTimeLiterals Logická hodnota, ktorá udáva, či by vygenerovaný SQL mal obsahovať hodnoty časových literálov. Pri nastavení na hodnotu false sa časové hodnoty vždy zadávajú pomocou väzby parametra.

Predvolená hodnota: False
SupportsOdbcTimestampLiterals Logická hodnota, ktorá udáva, či by vygenerovaný SQL mal obsahovať hodnoty literálov časovej pečiatky. Keď je nastavená hodnota false, hodnoty časovej pečiatky sa vždy zadávajú pomocou väzby parametra.

Predvolená hodnota: False

Prepisovanie stĺpcov SQLColumns

SQLColumns je obslužný program funkcie, ktorý prijíma výsledky volania ODBC do sqlColumns. Zdrojový parameter obsahuje tabuľku s informáciami o type údajov. Toto prepísanie sa zvyčajne používa na opravu nesúladov typov údajov medzi volaniami a SQLGetTypeInfoSQLColumns.

Podrobnosti o formáte parametra zdrojovej tabuľky nájdete v časti Funkcia SQLColumns.

Prepisovanie funkcií SQLGetFunctions

Toto pole sa používa na prepísanie SQLFunctions hodnôt vrátených ovládačom ODBC. Obsahuje záznam, ktorého názvy polí sa FunctionId rovnajú konštantám definovaným pre funkciu ODBC SQLGetFunctions . Číselné konštanty pre každé z týchto polí možno nájsť v špecifikácii ODBC.

Pole Podrobnosti
SQL_CONVERT_FUNCTIONS Udáva, ktoré funkcie sú podporované pri konverziách typu. V predvolenom nastavení sa nástroj jazyka M pokúša použiť funkciu CONVERT. Ovládače, ktoré preferujú použitie funkcie CAST, môžu túto hodnotu prepísať na zostavu, v ktorej je podporovaná len SQL_FN_CVT_CAST (číselná hodnota 0x2).
SQL_API_SQLBINDCOL Logická hodnota (True/False) určujúca, či by mal nástroj mashup používať rozhranie SQLBindCol API pri načítavaní údajov. Pri nastavení na hodnotu false sa namiesto toho použije SQLGetData .

Predvolená hodnota: False

Nasledujúci zlomok kódu obsahuje príklad, ktorý hovorí nástroju jazyka M, aby používal funkciu CAST namiesto funkcie CONVERT.

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

Prepisovanie sqlGetInfo

Toto pole sa používa na prepísanie SQLGetInfo hodnôt vrátených ovládačom ODBC. Obsahuje záznam, ktorého polia sú názvy rovné InfoType konštantám definovaným pre funkciu ODBC SQLGetInfo . Číselné konštanty pre každé z týchto polí možno nájsť v špecifikácii ODBC. Úplný zoznam InfoTypes skontrolovaných možností nájdete v súboroch sledovania nástroja mashup.

Nasledujúca tabuľka obsahuje bežne prepísané SQLGetInfo vlastnosti:

Pole Podrobnosti
SQL_SQL_CONFORMANCE Celočíselná hodnota, ktorá označuje úroveň SQL-92 podporovanú ovládačom:

(1) SQL_SC_SQL92_ENTRY: Vstupná úroveň SQL-92 je kompatibilná.
(2) SQL_SC_FIPS127_2_TRANSITIONAL: Prechodná úroveň FIPS 127-2 je v súlade s prechodným obdobím.
(4) SQL_SC_ SQL92_INTERMEDIATE" Kompatibilná s požiadavkami SQL-92 na strednej úrovni.
(8) SQL_SC_SQL92_FULL: Kompatibilná s požiadavkami SQL-92 na celej úrovni.

V scenároch doplnku Power Query sa konektor používa v režime Iba na čítanie. Väčšina ovládačov bude chcieť nahlásiť úroveň súladu SQL_SC_SQL92_FULL a prepísať konkrétne správanie generovania SQL pomocou SQLGetInfo vlastností a SQLGetFunctions .
SQL_SQL92_PREDICATES Bitová maska vyčíslená predikáty podporované v príkaze SELECT, ako je definované v SQL-92.

Prejdite na SQL_SP_* konštanty v špecifikácii ODBC.
SQL_AGGREGATE_FUNCTIONS Podpora kódovania bitovej masky pre agregačné funkcie.

SQL_AF_ALL
SQL_AF_AVG
SQL_AF_COUNT
SQL_AF_DISTINCT
SQL_AF_MAX
SQL_AF_MIN
SQL_AF_SUM

Prejdite na konštanty SQL_AF_* v špecifikácii ODBC.
SQL_GROUP_BY Celočíselná hodnota, ktorá určuje vzťah medzi stĺpcami v klauzule GROUP BY a neagregovanými stĺpcami v zozname výberu:

SQL_GB_COLLATE: Klauzulu COLLATE možno zadať na konci každého stĺpca zoskupenia.

SQL_GB_NOT_SUPPORTED: Klauzuly GROUP BY nie sú podporované.

SQL_GB_GROUP_BY_EQUALS_SELECT: Klauzula GROUP BY musí obsahovať všetky neagregované stĺpce v zozname výberu. Nemôže obsahovať žiadne ďalšie stĺpce. MÔŽETE NAPRÍKLAD VYBRAŤ POLOŽKU DEPT, MAX(SALARY) ZO SKUPINY ZAMESTNANCOV PODĽA ODDELENIA.

SQL_GB_GROUP_BY_CONTAINS_SELECT: Klauzula GROUP BY musí obsahovať všetky neagregované stĺpce v zozname výberu. Môže obsahovať stĺpce, ktoré nie sú v zozname výberu. VYBERTE NAPRÍKLAD POLOŽKY DEPT, MAX(SALARY) ZO SKUPINY ZAMESTNANCOV PODĽA ODDELENIA, VEKU.

SQL_GB_NO_RELATION: Stĺpce v klauzule GROUP BY a zoznam výberu nie sú prepojené. Význam zoskupených a neagregovaných stĺpcov v zozname výberu závisí od zdroja údajov. VYBERTE NAPRÍKLAD POLOŽKY DEPT, SALARY ZO SKUPINY ZAMESTNANCOV PODĽA DEPT A AGE.

Prejdite na SQL_GB_* konštanty v špecifikácii ODBC.

Nasledujúcu pomocnú funkciu možno použiť na vytvorenie hodnôt bitovej masky zo zoznamu celočíselných hodnôt:

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;

Prepísanie položky SQLGetTypeInfo

SQLGetTypeInfo možno zadať dvoma spôsobmi:

  • Pevná table hodnota, ktorá obsahuje informácie rovnakého typu ako volanie ODBC do SQLGetTypeInfo.
  • Funkcia, ktorá prijíma argument tabuľky a vracia tabuľku. Argument obsahuje pôvodné výsledky volania ODBC do SQLGetTypeInfo. Implementácia funkcie môže túto tabuľku upraviť alebo pridať.

Prvý prístup sa používa na úplné prepísanie hodnôt vrátených ovládačom ODBC. Druhý prístup sa používa, ak chcete tieto hodnoty pridať alebo upraviť.

Podrobnosti o formáte parametra tabuľky typov a očakávanej vrátenej hodnote nájdete v časti Odkaz na funkciu SQLGetTypeInfo.

SQLGetTypeInfo pomocou statickej tabuľky

Nasledujúci zlomok kódu poskytuje statickú implementáciu pre 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 pomocou funkcie

Nasledujúce zlomky kódu pripoja bpchar typ k existujúcim typom vráteným ovládačom.

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;

Nastavenie reťazec pripojenia

Reťazec pripojenia pre ovládač ODBC sa nastaví pomocou prvého argumentu pre funkcie Odbc.DataSource a Odbc.Query. Hodnotou môže byť text alebo M záznam. Pri použití záznamu sa každé pole v zázname stane vlastnosťou v reťazec pripojenia. Všetky reťazec pripojenia vyžadujú Driver pole (alebo DSN pole, ak od používateľov vyžaduje, aby najprv nakonfigurali DSN systémovej úrovne). Vlastnosti súvisiace s prihlasovacími povereniami sa nastavia samostatne. Ostatné vlastnosti sú špecifické pre ovládače.

Úryvok kódu nižšie zobrazuje definíciu novej funkcie zdroja údajov, vytvorenie záznamu ConnectionString a vyvolanie funkcie 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;

Ďalšie kroky