Auf Englisch lesen

Freigeben über


Parameter für Odbc.DataSource

Die Funktion Odbc.DataSource nimmt zwei Parameter entgegen: connectionString für Ihren Treiber und einen options -Datensatz, mit dem Sie verschiedene Verhaltensweisen des Treibers außer Kraft setzen können. Über den Optionssatz können Sie Fähigkeiten und andere vom Treiber gemeldete Informationen außer Kraft setzen, das Verhalten des Navigators steuern und die von der M-Engine generierten SQL-Abfragen beeinflussen.

Die unterstützten Optionsdatensatzfelder lassen sich in zwei Kategorien einteilen: diejenigen, die öffentlich und immer verfügbar sind, und diejenigen, die nur in einem Erweiterungskontext verfügbar sind.

In der folgenden Tabelle werden die öffentlichen Felder im Optionssatz beschrieben.

Feld Beschreibung
CommandTimeout Ein Dauerwert, der steuert, wie lange die serverseitige Abfrage laufen darf, bevor sie abgebrochen wird.

Standard: 10 Minuten
ConnectionTimeout Ein Wert für die Dauer, der bestimmt, wie lange gewartet werden soll, bevor der Versuch, eine Verbindung zum Server herzustellen, abgebrochen wird.

Standard: 15 Sekunden
CreateNavigationProperties Ein logischer Wert, der festlegt, ob Navigationseigenschaften für die zurückgegebenen Tabellen erzeugt werden sollen. Die Navigationseigenschaften basieren auf den vom Treiber gemeldeten Fremdschlüsselbeziehungen. Diese Eigenschaften werden als „virtuelle“ Spalten angezeigt, die im Abfrageeditor erweitert werden können, um die entsprechende Verknüpfung zu erstellen.

Wenn die Berechnung von Fremdschlüsselabhängigkeiten für Ihren Treiber einen teuren Vorgang darstellt, müssen Sie diesen Wert auf false setzen.

Standardwert: TRUE
HierarchicalNavigation Logischer Wert, der angibt, ob die Tabellen nach ihren Schemanamen gruppiert angezeigt werden sollen. Bei der Einstellung false werden die Tabellen in einer flachen Liste unter jeder Datenbank angezeigt.

Standardwert: FALSE
SqlCompatibleWindowsAuth Ein logischer Wert, der bestimmt, ob bei Verwendung der Windows-Authentifizierung eine SQL Server-kompatible Verbindungszeichenfolge erzeugt werden soll -Trusted_Connection=Yes.

Wenn Ihr Treiber die Windows-Authentifizierung unterstützt, aber zusätzliche oder alternative Einstellungen in Ihrer Verbindungszeichenfolge erfordert, müssen Sie diesen Wert auf false setzen und das in der nächsten Tabelle beschriebene Datensatzfeld CredentialConnectionString options verwenden.

Standardwert: TRUE

In der folgenden Tabelle werden die Felder des Optionsdatensatzes beschrieben, die nur über die Erweiterbarkeit verfügbar sind. Felder, die keine einfachen literalen Werte sind, werden in späteren Abschnitten beschrieben.

Feld Beschreibung
AstVisitor Ein Datensatz, der eine oder mehrere Überschreibungen zur Steuerung der SQL-Abfrageerstellung enthält. Die häufigste Verwendung dieses Feldes ist die Bereitstellung einer Logik zur Erzeugung einer LIMIT/OFFSET-Klausel für Treiber, die TOP nicht unterstützen.

Die Felder umfassen Constant und LimitClause.

Weitere Informationen: Überschreiben von AstVisitor
CancelQueryExplicitly Ein logischer Wert, der die M-Engine anweist, alle laufenden Aufrufe über den ODBC-Treiber explizit abzubrechen, bevor die Verbindung zum ODBC-Server beendet wird.

Dieses Feld ist in Situationen nützlich, in denen die Abfrageausführung unabhängig von den Netzwerkverbindungen zum Server verwaltet wird, z. B. in einigen Spark-Implementierungen. In den meisten Fällen muss dieser Wert nicht gesetzt werden, da die Abfrage im Server abgebrochen wird, wenn die Netzwerkverbindung zum Server beendet wird.

Standardwert: FALSE
ClientConnectionPooling Ein logischer Wert, der das clientseitige Verbindungspooling für den ODBC-Treiber aktiviert. Die meisten Fahrer werden diesen Wert auf true setzen wollen.

Standardwert: FALSE
CredentialConnectionString Ein Text- oder Datensatzwert, der verwendet wird, um mit Anmeldeinformationen verbundene Verbindungsstring-Eigenschaften anzugeben.
HideNativeQuery Ein logischer Wert, der steuert, ob der Connector generierte SQL-Anweisungen in der Power Query-Benutzeroberfläche anzeigt oder nicht. Dieser Wert sollte nur dann auf true gesetzt werden, wenn die Backend-Datenquelle SQL-92 von Haus aus unterstützt.

Standardwert: FALSE
ImplicitTypeConversions Ein Tabellenwert mit impliziten Typkonvertierungen, die von Ihrem Treiber oder Backend-Server unterstützt werden. Die Werte in dieser Tabelle sind additiv zu den vom Treiber selbst gemeldeten Umrechnungen.

Dieses Feld wird in der Regel zusammen mit dem Feld SQLGetTypeInfo verwendet, wenn die vom Treiber gemeldeten Datentypinformationen außer Kraft gesetzt werden sollen.
OnError Eine Fehlerbehandlungsfunktion, die einen Parameter errorRecord vom Typ recorderhält.

Zu den üblichen Verwendungszwecken dieser Funktion gehören die Behandlung von SSL-Verbindungsfehlern, die Bereitstellung eines Download-Links, wenn Ihr Treiber auf dem System nicht gefunden wird, und die Meldung von Authentifizierungsfehlern.
SoftNumbers Ermöglicht es der M-Engine, einen kompatiblen Datentyp auszuwählen, wenn die Konvertierung zwischen zwei bestimmten numerischen Typen in den SQL_CONVERT_*-Fähigkeiten nicht als unterstützt deklariert ist.

Standardwert: FALSE
SqlCapabilities Ein Datensatz, der verschiedene Überschreibungen von Treiberfähigkeiten bietet und eine Möglichkeit, Fähigkeiten zu spezifizieren, die nicht durch ODBC 3.8 ausgedrückt werden.

Weitere Informationen: SqlCapabilities überschreiben
SQLColumns Eine Funktion, mit der Sie die von der Funktion SQLColumns zurückgegebenen Spaltenmetadaten ändern können.

Weitere Informationen: SQLColumns überschreiben
SQLGetFunctions Ein Datensatz, mit dem Sie die von Aufrufen an SQLGetFunctionszurückgegebenen Werte überschreiben können.

Dieses Feld wird häufig verwendet, um die Verwendung der Parameterbindung zu deaktivieren oder um anzugeben, dass generierte Abfragen CAST statt CONVERT verwenden sollen.

Weitere Informationen: Überschreiben von SQLGetFunctions
SQLGetInfo Ein Datensatz, mit dem Sie die von Aufrufen an SQLGetInfozurückgegebenen Werte überschreiben können.

Weitere Informationen: Überschreiben von SQLGetInfo
SQLGetTypeInfo Eine Tabelle oder Funktion, die eine Tabelle zurückgibt, die die von SQLGetTypeInfozurückgegebenen Typinformationen außer Kraft setzt.

Wenn der Wert auf eine Tabelle gesetzt wird, ersetzt der Wert vollständig die vom Treiber gemeldeten Typinformationen. SQLGetTypeInfo nicht angerufen werden.

Wenn der Wert auf eine Funktion gesetzt wird, erhält Ihre Funktion das Ergebnis des ursprünglichen Aufrufs von SQLGetTypeInfo, sodass Sie die Tabelle ändern können.

Dieses Feld wird in der Regel verwendet, wenn es eine Abweichung zwischen den von SQLGetTypeInfo und SQLColumnsgemeldeten Datentypen gibt.

Weitere Informationen: Überschreiben von SQLGetTypeInfo
SQLTables Eine Funktion, mit der Sie die durch einen Aufruf von SQLTableszurückgegebenen Tabellen-Metadaten ändern können.
TolerateConcatOverflow Ermöglicht die Verkettung von Textwerten, auch wenn das Ergebnis abgeschnitten werden könnte, um in den Bereich eines verfügbaren Typs zu passen.

Wenn beispielsweise ein VARCHAR(4000)-Feld mit einem VARCHAR(4000)-Feld auf einem System verkettet wird, das eine maximale VARCHAR-Größe von 4000 und keinen CLOB-Typ unterstützt, wird die Verkettung gefaltet, obwohl das Ergebnis möglicherweise abgeschnitten wird.

Standardwert: FALSE
UseEmbeddedDriver (interner Gebrauch): Ein logischer Wert, der steuert, ob der ODBC-Treiber aus einem lokalen Verzeichnis geladen werden soll (unter Verwendung einer neuen Funktionalität, die in der ODBC 4.0-Spezifikation definiert ist). Dieser Wert wird im Allgemeinen nur von Connectors gesetzt, die von Microsoft erstellt und mit Power Query ausgeliefert werden.

Wenn dieser Wert auf false gesetzt ist, wird der ODBC-Treibermanager des Systems verwendet, um den Treiber zu finden und zu laden.

Bei den meisten Connectors sollte dieses Feld nicht gesetzt werden müssen.

Standardwert: FALSE

Überschreiben von AstVisitor

Das Feld AstVisitor wird über den Optionssatz Odbc.DataSource festgelegt. Sie wird verwendet, um SQL-Anweisungen zu ändern, die für bestimmte Abfrageszenarien generiert werden.

Hinweis

Treiber, die LIMIT- und OFFSET-Klauseln (und nicht TOP) unterstützen, wollen eine LimitClause Überschreibung für AstVisitoranbieten.

Konstante

Die Bereitstellung einer Überschreibung für diesen Wert ist veraltet und wird möglicherweise aus zukünftigen Implementierungen entfernt werden.

LimitClause

Dieses Feld ist eine Funktion, die zwei Int64.Type Argumente (skip, take) erhält und einen Datensatz mit zwei Textfeldern (Text, Location) zurückgibt.

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

Der Parameter skip ist die Anzahl der zu überspringenden Zeilen (d.h. das Argument für OFFSET). Wenn kein Offset angegeben wird, ist der Wert für das Überspringen gleich Null. Wenn Ihr Treiber LIMIT, aber nicht OFFSET unterstützt, sollte die Funktion LimitClause einen nicht implementierten Fehler (...) zurückgeben, wenn skip größer als 0 ist.

Der Parameter take ist die Anzahl der zu übernehmenden Zeilen (d.h. das Argument für LIMIT).

Das Feld Text des Ergebnisses enthält den SQL-Text, der der generierten Abfrage hinzugefügt werden soll.

Das Feld Location gibt an, wo die Klausel eingefügt werden soll. Die folgende Tabelle beschreibt die unterstützten Werte.

Wert Beschreibung Beispiel
AfterQuerySpecification Die LIMIT-Klausel wird an das Ende des generierten SQLs gesetzt.

Dies ist die am häufigsten unterstützte LIMIT-Syntax.
a, b, c WÄHLEN

FROM-Tabelle

WHERE a > 10

BEGRENZUNG 5
BeforeQuerySpecification Die LIMIT-Klausel wird vor die generierte SQL-Anweisung gesetzt. LIMIT 5 ZEILEN

a, b, c WÄHLEN

FROM-Tabelle

WHERE a > 10
AfterSelect LIMIT steht nach der SELECT-Anweisung und nach allen Modifikatoren (wie DISTINCT). SELECT DISTINCT LIMIT 5 a, b, c

FROM-Tabelle

WHERE a > 10
AfterSelectBeforeModifiers LIMIT steht nach der SELECT-Anweisung, aber vor allen Modifikatoren (wie DISTINCT). SELECT LIMIT 5 DISTINCT a, b, c

FROM-Tabelle

WHERE a > 10

Der folgende Codeschnipsel bietet eine LimitClause-Implementierung für einen Treiber, der eine LIMIT-Klausel mit einem optionalen OFFSET im folgenden Format erwartet: [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"
        ]

Der folgende Codeschnipsel enthält eine LimitClause -Implementierung für einen Treiber, der LIMIT, aber nicht OFFSET unterstützt. 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"
    ]

SqlCapabilities überschreiben

Feld Details
FractionalSecondsScale Ein Zahlenwert zwischen 1 und 7, der die Anzahl der unterstützten Dezimalstellen für Millisekundenwerte angibt. Dieser Wert sollte von Connectors gesetzt werden, die das Query Folding über Datumswerte ermöglichen wollen.

Voreinstellung: null
PrepareStatements Ein logischer Wert, der angibt, dass Anweisungen mit SQLPreparevorbereitet werden sollen.

Standardwert: FALSE
SupportsTop Logischer Wert, der angibt, dass der Treiber die TOP-Klausel zur Begrenzung der Anzahl der zurückgegebenen Zeilen unterstützt.

Standardwert: FALSE
StringLiteralEscapeCharacters Eine Liste von Textwerten, die das/die zu verwendende(n) Zeichen angeben, wenn Zeichenfolgenliterale und LIKE-Ausdrücke escaped werden.

Beispiel: {""}

Voreinstellung: null
SupportsDerivedTable Logischer Wert, der angibt, dass der Treiber abgeleitete Tabellen (Subselects) unterstützt.

Bei Treibern, die ihre Konformitätsstufe auf SQL_SC_SQL92_FULL setzen (vom Treiber gemeldet oder mit der Einstellung Sql92Conformance überschrieben), wird dieser Wert als wahr angenommen. Für alle anderen Konformitätsstufen ist dieser Wert standardmäßig auf false gesetzt.

Wenn Ihr Treiber die Konformitätsstufe SQL_SC_SQL92_FULL nicht meldet, aber abgeleitete Tabellen unterstützt, setzen Sie diesen Wert auf true.

Die Unterstützung von abgeleiteten Tabellen ist für viele DirectQuery-Szenarien erforderlich.
SupportsNumericLiterals Ein logischer Wert, der angibt, ob das generierte SQL numerische Literale enthalten soll. Bei der Einstellung false werden numerische Werte immer über die Parameterbindung angegeben.

Standardwert: FALSE
SupportsStringLiterals Ein logischer Wert, der angibt, ob das generierte SQL Stringliterale enthalten soll. Bei der Einstellung false werden Zeichenkettenwerte immer mit Hilfe der Parameterbindung angegeben.

Standardwert: FALSE
SupportsOdbcDateLiterals Ein logischer Wert, der angibt, ob die generierte SQL Datumsliterale enthalten soll. Bei der Einstellung false werden Datumswerte immer über die Parameterbindung angegeben.

Standardwert: FALSE
SupportsOdbcTimeLiterals Ein logischer Wert, der angibt, ob das generierte SQL Zeitliterale enthalten soll. Bei der Einstellung false werden Zeitwerte immer über die Parameterbindung angegeben.

Standardwert: FALSE
SupportsOdbcTimestampLiterals Ein logischer Wert, der angibt, ob die generierte SQL Zeitstempel-Literale enthalten soll. Bei der Einstellung „false“ werden Zeitstempelwerte immer über die Parameterbindung angegeben.

Standardwert: FALSE

SQLColumns überschreiben

SQLColumns ist ein Funktionshandler, der die Ergebnisse eines ODBC-Aufrufs an SQLColumnsempfängt. Der Quellparameter enthält eine Tabelle mit den Datentypinformationen. Diese Überschreibung wird in der Regel verwendet, um Datentypübereinstimmungen zwischen Aufrufen von SQLGetTypeInfo und SQLColumnszu beheben.

Einzelheiten zum Format der Parameter der Quelltabelle finden Sie unter SQLColumns Function.

Überschreiben von SQLGetFunctions

Dieses Feld wird verwendet, um die von einem ODBC-Treiber zurückgegebenen SQLFunctions Werte zu überschreiben. Sie enthält einen Datensatz, dessen Feldnamen den FunctionId Konstanten entsprechen, die für die Funktion ODBC SQLGetFunctions definiert sind. Numerische Konstanten für jedes dieser Felder sind in der ODBC-Spezifikationzu finden.

Feld Details
SQL_CONVERT_FUNCTIONS Gibt an, welche Funktion(en) bei Typumwandlungen unterstützt werden. Standardmäßig versucht die M-Engine, die Funktion CONVERT zu verwenden. Treiber, die die Verwendung von CAST bevorzugen, können diesen Wert außer Kraft setzen, um zu melden, dass nur SQL_FN_CVT_CAST (numerischer Wert von 0x2) unterstützt wird.
SQL_API_SQLBINDCOL Ein logischer Wert (true/false), der angibt, ob die Mashup-Engine beim Abrufen von Daten die SQLBindCol API verwenden soll. Ist dieser Wert auf false gesetzt, wird stattdessen SQLGetData verwendet.

Standardwert: FALSE

Der folgende Codeausschnitt enthält ein Beispiel, in dem die M-Engine explizit angewiesen wird, CAST anstelle von CONVERT zu verwenden.

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

Überschreiben von SQLGetInfo

Dieses Feld wird verwendet, um die von einem ODBC-Treiber zurückgegebenen SQLGetInfo Werte zu überschreiben. Sie enthält einen Datensatz, dessen Felder den InfoType Konstanten entsprechen, die für die Funktion ODBC SQLGetInfo definiert sind. Numerische Konstanten für jedes dieser Felder sind in der ODBC-Spezifikationzu finden. Die vollständige Liste der geprüften InfoTypes ist in den Trace-Dateien der Mashup-Engine zu finden.

Die folgende Tabelle enthält häufig überschriebene SQLGetInfo Eigenschaften:

Feld Details
SQL_SQL_CONFORMANCE Ein ganzzahliger Wert, der die vom Treiber unterstützte SQL-92-Stufe angibt:

(1) SQL_SC_SQL92_ENTRY: SQL-92-konformes Einstiegsniveau.
(2) SQL_SC_FIPS127_2_TRANSITIONAL: FIPS 127-2-Übergangsstufe konform.
(4) SQL_SC_ SQL92_INTERMEDIATE" SQL-92-konforme Mittelstufe.
(8) SQL_SC_SQL92_FULL: Vollständig SQL-92-konform.

In Power Query-Szenarien wird der Connector in einem Nur-Lese-Modus verwendet. Die meisten Treiber werden ein SQL_SC_SQL92_FULL Konformitätsniveau melden wollen und ein bestimmtes SQL-Generierungsverhalten mit den Eigenschaften SQLGetInfo und SQLGetFunctions außer Kraft setzen.
SQL_SQL92_PREDICATES Eine Bitmaske, die die in einer SELECT-Anweisung unterstützten Prädikate auflistet, wie in SQL-92 definiert.

Besuchen Sie SQL_SP_* Konstanten in der ODBC-Spezifikation.
SQL_AGGREGATE_FUNCTIONS Eine Bitmaske zur Aufzählung der Unterstützung für Aggregationsfunktionen.

SQL_AF_ALL
SQL_AF_AVG
SQL_AF_COUNT
SQL_AF_DISTINCT
SQL_AF_MAX
SQL_AF_MIN
SQL_AF_SUM

Besuchen Sie SQL_AF_* Konstanten in der ODBC-Spezifikation.
SQL_GROUP_BY Ein ganzzahliger Wert, der die Beziehung zwischen den Spalten in der GROUP BY-Klausel und den nicht aggregierten Spalten in der Select-Liste angibt:

SQL_GB_COLLATE: Am Ende jeder Gruppierungsspalte kann eine COLLATE-Klausel angegeben werden.

SQL_GB_NOT_SUPPORTED: GROUP BY-Klauseln werden nicht unterstützt.

SQL_GB_GROUP_BY_EQUALS_SELECT: Die GROUP BY-Klausel muss alle nicht aggregierten Spalten in der Auswahlliste enthalten. Sie darf keine anderen Spalten enthalten. Zum Beispiel: SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT.

SQL_GB_GROUP_BY_CONTAINS_SELECT: Die GROUP BY-Klausel muss alle nicht aggregierten Spalten in der Auswahlliste enthalten. Sie kann Spalten enthalten, die nicht in der Auswahlliste enthalten sind. Beispiel: SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT, AGE.

SQL_GB_NO_RELATION: Die Spalten in der GROUP BY-Klausel und die Auswahlliste sind nicht miteinander verknüpft. Die Bedeutung von nicht gruppierten, nicht aggregierten Spalten in der Auswahlliste ist datenquellenabhängig. Zum Beispiel: SELECT DEPT, SALARY FROM EMPLOYEE GROUP BY DEPT, AGE.

Besuchen Sie SQL_GB_* Konstanten in der ODBC-Spezifikation.

Die folgende Hilfsfunktion kann verwendet werden, um Bitmaskenwerte aus einer Liste von Ganzzahlwerten zu erstellen:

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;

Überschreiben von SQLGetTypeInfo

SQLGetTypeInfo kann auf zwei Arten angegeben werden:

  • Ein fester Wert table, der die gleichen Typinformationen enthält wie ein ODBC-Aufruf an SQLGetTypeInfo.
  • Eine Funktion, die ein Tabellenargument annimmt und eine Tabelle zurückgibt. Das Argument enthält die ursprünglichen Ergebnisse des ODBC-Aufrufs an SQLGetTypeInfo. Ihre Funktionsimplementierung kann diese Tabelle ändern oder ergänzen.

Der erste Ansatz wird verwendet, um die vom ODBC-Treiber zurückgegebenen Werte vollständig zu überschreiben. Der zweite Ansatz wird verwendet, wenn Sie diese Werte ergänzen oder ändern möchten.

Einzelheiten zum Format des Parameters „types table“ und zum erwarteten Rückgabewert finden Sie unter SQLGetTypeInfo function reference.

SQLGetTypeInfo unter Verwendung einer statischen Tabelle

Der folgende Codeschnipsel bietet eine statische Implementierung für 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 mit einer Funktion

Die folgenden Codeschnipsel fügen den Typ bpchar an die vorhandenen, vom Treiber zurückgegebenen Typen an.

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;

Einstellen der Verbindungszeichenfolge

Die Verbindungszeichenfolge für Ihren ODBC-Treiber wird über das erste Argument der Funktionen Odbc.DataSource und Odbc.Query festgelegt. Der Wert kann ein Text oder ein M-Datensatz sein. Bei Verwendung des Datensatzes wird jedes Feld des Datensatzes zu einer Eigenschaft in der Verbindungszeichenfolge. Alle Verbindungszeichenfolgen erfordern ein Driver Feld (oder DSN Feld, wenn Sie von den Benutzern verlangen, einen DSN auf Systemebene vorzukonfigurieren). Credential-bezogene Eigenschaften werden separat festgelegt. Andere Eigenschaften sind treiberspezifisch.

Der folgende Codeausschnitt zeigt die Definition einer neuen Datenquellenfunktion, die Erstellung des Datensatzes ConnectionString und den Aufruf der Funktion 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;

Nächste Schritte