Parameter für „Odbc.DataSource“

Die Odbc.DataSource-Funktion verwendet zwei Parameter: einen connectionString für Ihren Treiber und einen Datensatz, options mit dem Sie verschiedene Treiberverhalten außer Kraft setzen können. Über den Optionsdatensatz können Sie Funktionen und andere vom Treiber gemeldete Informationen überschreiben, das Navigatorverhalten steuern und die SQL von der M-Engine generierten Abfragen beeinflussen.

Die unterstützten Optionsdatensätze lassen sich in zwei Kategorien unterteilen: öffentliche und immer verfügbare Felder und Felder, die nur in einem Erweiterbarkeitskontext verfügbar sind.

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

Feld BESCHREIBUNG
CommandTimeout Ein Duration-Wert, der steuert, wie lange die serverseitige Abfrage ausgeführt werden darf, bevor sie abgebrochen wird.

Standardwert: 10 Minuten
ConnectionTimeout Ein Duration-Wert, der steuert, wie lange gewartet werden soll, bevor ein Versuch, eine Verbindung mit dem Server herzustellen, verabbrucht wird.

Standardwert: 15 Sekunden
CreateNavigationProperties Ein logischer Wert, der bestimmt, ob Navigationseigenschaften für die zurückgegebenen Tabellen generiert werden. Navigationseigenschaften basieren auf Fremdschlüsselbeziehungen, die vom Treiber gemeldet werden. Diese Eigenschaften werden als "virtuelle" Spalten angezeigt, die im Abfrage-Editor erweitert werden können, um den entsprechenden Join zu erstellen.

Wenn die Berechnung von Fremdschlüsselabhängigkeiten ein aufwendiger Vorgang für Ihren Treiber ist, sollten Sie diesen Wert auf FALSE festlegen.

Standardwert: TRUE
HierarchicalNavigation Ein logischer Wert, der bestimmt, ob die Tabellen nach ihren Schemanamen angezeigt werden. Wenn false festgelegt ist, werden Tabellen in einer flachen Liste unter jeder Datenbank angezeigt.

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

Wenn Ihr Treiber die Windows-Authentifizierung unterstützt, aber zusätzliche oder alternative Einstellungen in der Verbindungszeichenfolge erfordert, sollten Sie diesen Wert auf FALSE CredentialConnectionString festlegen und das in der nächsten Tabelle beschriebene Feld für Optionsdatensatz verwenden.

Standardwert: TRUE

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

Feld BESCHREIBUNG
AstVisitor Ein Datensatz, der eine oder mehrere Außerkraftsetzungen zum Steuern SQL Abfragegenerierung enthält. Die häufigste Verwendung dieses Felds besteht in der Bereitstellung von Logik zum Generieren einer LIMIT/OFFSET-Klausel für Treiber, die TOP nicht unterstützen.

Zu den Feldern Constant gehören und LimitClause.

Weitere Informationen finden Sie unter Überschreiben von AstVisitor.
CancelQueryExplicitly Ein logischer Wert, der die M-Engine anweisen soll, alle ausgeführten Aufrufe über den ODBC-Treiber explizit abzubruchen, bevor die Verbindung mit dem ODBC-Server beendet wird.

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

Standardwert: FALSE
ClientConnectionPooling Ein logischer Wert, der clientseitiges Verbindungspooling für den ODBC-Treiber ermöglicht. Die meisten Treiber möchten diesen Wert auf TRUE festlegen.

Standardwert: FALSE
CredentialConnectionString Ein Text- oder Datensatzwert, der zum Angeben von Verbindungszeichenfolgeneigenschaften im Zusammenhang mit Anmeldeinformationen verwendet wird.
HideNativeQuery Ein logischer Wert, der steuert, ob der Connector generierte SQL-Anweisungen in der Power Query zeigt. Dies sollte nur auf TRUE festgelegt werden, wenn die Back-End-Datenquelle nativ SQL-92 unterstützt.

Standardwert: FALSE
ImplicitTypeConversions Ein Tabellenwert, der implizite Typkonvertierungen enthält, die vom Treiber oder Back-End-Server unterstützt werden. Die Werte in dieser Tabelle sind additiv zu den Konvertierungen, die vom Treiber selbst gemeldet werden.

Dieses Feld wird in der Regel mit dem Feld verwendet SQLGetTypeInfo , wenn vom Treiber gemeldete Datentypinformationen überschrieben werden.
OnError Eine Fehlerbehandlungsfunktion, die einen Parameter errorRecord vom Typ empfängt record.

Häufige Verwendungsmöglichkeiten dieser Funktion sind das Behandeln von SSL-Verbindungsfehlern, das Bereitstellen eines Downloadlinks, wenn Ihr Treiber nicht im System gefunden wird, und das Melden von Authentifizierungsfehlern.
SoftNumbers Ermöglicht der M-Engine die Auswahl eines kompatiblen Datentyps, wenn die Konvertierung zwischen zwei bestimmten numerischen Typen nicht als unterstützt in den funktionen SQL_CONVERT_* deklariert wird.

Standardwert: FALSE
SqlCapabilities Ein Datensatz, der verschiedene Außerkraftsetzungen von Treiberfunktionen und eine Möglichkeit zum Angeben von Funktionen bietet, die nicht über ODBC 3.8 ausgedrückt werden.

Weitere Informationen finden Sie unter Überschreiben von SqlCapabilities.
SQLColumns Eine Funktion, mit der Sie spaltenmetadaten ändern können, die von der Funktion zurückgegeben SQLColumns werden.

Weitere Informationen finden Sie unter Überschreiben von SQLColumns.
SQLGetFunctions Ein Datensatz, mit dem Sie Werte überschreiben können, die von Aufrufen von zurückgegeben werden SQLGetFunctions.

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

Weitere Informationen finden Sie unter Überschreiben von SQLGetFunctions.
SQLGetInfo Ein Datensatz, mit dem Sie Werte überschreiben können, die von Aufrufen von zurückgegeben werden SQLGetInfo.

Weitere Informationen finden Sie unter Überschreiben von SQLGetInfo.
SQLGetTypeInfo Eine Tabelle oder Funktion, die eine Tabelle zurückgibt, die die von zurückgegebenen Typinformationen überschreibt SQLGetTypeInfo.

Wenn der Wert auf eine Tabelle festgelegt ist, ersetzt der Wert vollständig die vom Treiber gemeldeten Typinformationen. SQLGetTypeInfo wird nicht aufgerufen.

Wenn der Wert auf eine Funktion festgelegt ist, SQLGetTypeInfoerhält Ihre Funktion das Ergebnis des ursprünglichen Aufrufs von , sodass Sie die Tabelle ändern können.

Dieses Feld wird in der Regel verwendet, wenn ein Konflikt zwischen den von und gemeldeten Datentypen SQLGetTypeInfo vor liegt SQLColumns.

Weitere Informationen finden Sie unter Überschreiben von SQLGetTypeInfo.
SQLTables Eine Funktion, mit der Sie die Tabellenmetadaten ändern können, die durch einen Aufruf von zurückgegeben werden SQLTables.
TolerateConcatOverflow Ermöglicht die Verkettung von Textwerten, auch wenn das Ergebnis abgeschnitten werden kann, um in den Bereich eines verfügbaren Typs zu passen.

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

Standardwert: FALSE
UseEmbeddedDriver (interne Verwendung): Ein logischer Wert, der steuert, ob der ODBC-Treiber aus einem lokalen Verzeichnis geladen werden soll (mithilfe neuer Funktionen, die in der ODBC 4.0-Spezifikation definiert sind). Dieser Wert wird in der Regel nur von Von Microsoft erstellten Connectors festgelegt, die mit Power Query.

Wenn false festgelegt ist, wird der ODBC-Treiber-Manager des Systems verwendet, um den Treiber zu suchen und zu laden.

Die meisten Connectors sollten dieses Feld nicht festlegen müssen.

Standardwert: FALSE

Überschreiben von AstVisitor

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

Hinweis

Treiber, die LIMIT- und OFFSET-Klauseln (anstelle von TOP) unterstützen, möchten eine Überschreibung für LimitClause bereitstellen AstVisitor.

Konstant

Das Bereitstellen einer Überschreibung für diesen Wert ist veraltet und kann aus zukünftigen Implementierungen entfernt werden.

LimitClause

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

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

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

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

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

Das Location -Feld gibt an, wo die -Klausel eingefügt werden soll. In der folgenden Tabelle werden die unterstützten Werte beschrieben.

Wert BESCHREIBUNG Beispiel
AfterQuerySpecification Die LIMIT-Klausel wird am Ende des generierten SQL.

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

FROM-Tabelle

WHERE a > 10

LIMIT 5
BeforeQuerySpecification Die LIMIT-Klausel wird vor der generierten SQL gesetzt. LIMIT 5 ROWS

SELECT a, b, c

FROM-Tabelle

WHERE a > 10
AfterSelect LIMIT wird nach der SELECT-Anweisung und nach allen Modifizierern (z. B. DISTINCT) gesetzt. SELECT DISTINCT LIMIT 5 a, b, c

FROM-Tabelle

WHERE a > 10
AfterSelectBeforeModifiers LIMIT wird nach der SELECT-Anweisung, aber vor Modifizierern (z. B. DISTINCT) gesetzt. SELECT LIMIT 5 DISTINCT a, b, c

FROM-Tabelle

WHERE a > 10

Der folgende Codeausschnitt stellt eine LimitClause-Implementierung für einen Treiber zur Verfügung, 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 Codeausschnitt enthält eine Implementierung LimitClause 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"
    ]

Überschreiben von SqlCapabilities

Feld Informationen
FractionalSecondsScale Ein Zahlenwert zwischen 1 und 7, der die Anzahl von Dezimalstellen angibt, die für Millisekundenwerte unterstützt werden. Dieser Wert sollte von Connectors festgelegt werden, die das Query Folding über datetime-Werte aktivieren möchten.

Standardwert: NULL
PrepareStatements Ein logischer Wert, der angibt, dass Anweisungen mit SQLPrepare vorbereitet werden sollen.

Standardwert: FALSE
SupportsTop Ein logischer Wert, der angibt, dass der Treiber die TOP-Klausel unterstützt, um die Anzahl der zurückgegebenen Zeilen zu begrenzen.

Standardwert: FALSE
StringLiteralEscapeCharacters Eine Liste von Textwerten, die die Zeichen angeben, die beim Verwenden von Zeichenfolgenliteralen und LIKE-Ausdrücken mit Zeichenfolgenliteralen verwendet werden.

Ein Beispiel: {""}

Standardwert: NULL
SupportsDerivedTable Ein logischer Wert, der angibt, dass der Treiber abgeleitete Tabellen (Unterauswahlen) unterstützt.

Dieser Wert wird für Treiber angenommen, die ihre Konformitätsstufe auf SQL_SC_SQL92_FULL festlegen (vom Treiber gemeldet oder mit der Einstellung Sql92Conformance überschrieben). Für alle anderen Konformitätsebenen wird dieser Wert standardmäßig auf FALSE festgelegt.

Wenn Ihr Treiber die SQL_SC_SQL92_FULL Kompatibilitätsstufe nicht berichtet, aber von abgeleitete Tabellen unterstützt, legen Sie diesen Wert auf TRUE fest.

Die Unterstützung abgeleiteter Tabellen ist für viele DirectQuery-Szenarien erforderlich.
SupportsNumericLiterals Ein logischer Wert, der angibt, ob die generierte SQL numerische Literalwerte enthalten soll. Wenn der Wert auf FALSE festgelegt ist, werden numerische Werte immer mithilfe der Parameterbindung angegeben.

Standardwert: FALSE
SupportsStringLiterals Ein logischer Wert, der angibt, ob die SQL Zeichenfolgenliteralwerte enthalten soll. Wenn der Wert auf FALSE festgelegt ist, werden Zeichenfolgenwerte immer mithilfe der Parameterbindung angegeben.

Standardwert: FALSE
SupportsOdbcDateLiterals Ein logischer Wert, der angibt, ob die SQL Datumsliteralwerte enthalten soll. Wenn der Wert auf FALSE festgelegt ist, werden Datumswerte immer mithilfe der Parameterbindung angegeben.

Standardwert: FALSE
SupportsOdbcTimeLiterals Ein logischer Wert, der angibt, ob die SQL Werte für Zeitliterale enthalten soll. Wenn der Wert auf FALSE festgelegt ist, werden Zeitwerte immer mithilfe der Parameterbindung angegeben.

Standardwert: FALSE
SupportsOdbcTimestampLiterals Ein logischer Wert, der angibt, ob die SQL Werte für Zeitstempelliterale enthalten soll. Wenn der Wert auf FALSE festgelegt ist, werden timestamp-Werte immer mithilfe der Parameterbindung angegeben.

Standardwert: FALSE

Überschreiben von SQLColumns

SQLColumns ist ein Funktionshandler, der die Ergebnisse eines ODBC-Aufrufs von SQLColumns empfängt. Der Source-Parameter enthält eine Tabelle mit den Datentypinformationen. Diese Überschreibung wird in der Regel verwendet, um Datentypkonflikte zwischen Aufrufen von und zu SQLGetTypeInfo beheben SQLColumns.

Details zum Format des Quelltabellenparameters finden Sie unter SQLColumns-Funktion.

Überschreiben von SQLGetFunctions

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

Feld Informationen
SQL_CONVERT_FUNCTIONS Gibt an, welche Funktionen bei Typkonvertierungen unterstützt werden. Standardmäßig versucht die M-Engine, die CONVERT-Funktion zu verwenden. Treiber, die die Verwendung von CAST bevorzugen, können diesen Wert überschreiben, um zu melden, dass nur SQL_FN_CVT_CAST (numerischer Wert 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. Wenn diese Eigenschaft auf FALSE festgelegt ist, wird stattdessen SQLGetData verwendet.

Standardwert: FALSE

Der folgende Codeausschnitt enthält ein Beispiel, das die M-Engine explizit anfing, CAST anstelle von CONVERT zu verwenden.

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

Überschreiben von SQLGetInfo

Dieses Feld wird verwendet, um von einem SQLGetInfo ODBC-Treiber zurückgegebene Werte zu überschreiben. Sie enthält einen Datensatz, dessen Felder Namen sind, InfoType die den Konstanten für die ODBC SQLGetInfo-Funktion entspricht. Numerische Konstanten für jedes dieser Felder finden Sie in der ODBC-Spezifikation. Die vollständige Liste der InfoTypes überprüften Dateien finden Sie in den Ablaufverfolgungsdateien der Mashup-Engine.

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

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

(1) SQL_SC_SQL92_ENTRY: Einstiegsebene SQL-92-kompatibel.
(2) SQL_SC_FIPS127_2_TRANSITIONAL: FIPS 127-2-Übergangsstufe konform.
(4) SQL_SC_ SQL92_INTERMEDIATE" Zwischenstufe SQL-92-kompatibel.
(8) SQL_SC_SQL92_FULL: Vollständig SQL-92-kompatibel.

In Power Query Szenarien wird der Connector in einem schreibgeschützten Modus verwendet. Die meisten Treiber möchten eine SQL_SC_SQL92_FULL SQLGetInfo melden und bestimmtes Verhalten SQL-Generierung mithilfe der Eigenschaften und SQLGetFunctions überschreiben.
SQL_SQL92_PREDICATES Eine Bitmaske, die die in einer SELECT-Anweisung unterstützten Prädikate aufzählt, wie in SQL-92 definiert.

Wechseln Sie SQL_SP_* Konstanten in der ODBC-Spezifikation.
SQL_AGGREGATE_FUNCTIONS Eine Bitmaske, die Unterstützung für Aggregationsfunktionen aufzählt.

SQL_AF_ALL
SQL_AF_AVG
SQL_AF_COUNT
SQL_AF_DISTINCT
SQL_AF_MAX
SQL_AF_MIN
SQL_AF_SUM

Wechseln 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 Auswahlliste angibt:

SQL_GB_COLLATE: Eine COLLATE-Klausel kann am Ende jeder Gruppierungsspalte 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. Er darf keine anderen Spalten enthalten. 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. Er 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 der Auswahlliste sind nicht verknüpft. Die Bedeutung von nicht gruppierten, nicht aggregierten Spalten in der Auswahlliste ist datenquellenabhängig. Beispiel: SELECT DEPT, SALARY FROM EMPLOYEE GROUP BY DEPT, AGE.

Wechseln Sie SQL_GB_* Konstanten in der ODBC-Spezifikation.

Die folgende Hilfsfunktion kann verwendet werden, um Bitmaskenwerte aus einer Liste ganzzahliger Werte 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 table Wert, der die gleichen Typinformationen wie ein ODBC-Aufruf von enthält SQLGetTypeInfo.
  • Eine Funktion, die ein Tabellenargument akzeptiert und eine Tabelle zurückgibt. Das Argument enthält die ursprünglichen Ergebnisse des ODBC-Aufrufs von SQLGetTypeInfo. Ihre Funktionsimplementierung kann diese Tabelle ändern oder hinzufügen.

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 hinzufügen oder ändern möchten.

Details zum Format der Tabellenparameter vom Typ und zum erwarteten Rückgabewert finden Sie in der SqlGetTypeInfo-Funktionsreferenz.

SQLGetTypeInfo mithilfe einer statischen Tabelle

Der folgende Codeausschnitt 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 mithilfe einer Funktion

Die folgenden Codeausschnitte fügen den Typ an bpchar die vorhandenen Typen an, die vom Treiber zurückgegeben werden.

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;

Festlegen der Verbindungszeichenfolge

Die Verbindungszeichenfolge für Ihren ODBC-Treiber wird mithilfe des ersten Arguments für die Funktionen Odbc.DataSource und Odbc.Query festgelegt. Der Wert kann text oder ein M-Datensatz sein. Bei Verwendung des Datensatzes wird jedes Feld im Datensatz zu einer Eigenschaft in der Verbindungszeichenfolge. Alle Verbindungszeichenfolgen erfordern ein Feld Driver (oder DSN ein Feld, wenn Benutzer einen DSN auf Systemebene vorkonfiguriert haben müssen). Eigenschaften im Zusammenhang mit Anmeldeinformationen werden separat festgelegt. Andere Eigenschaften sind treiberspezifisch.

Der folgende Codeausschnitt zeigt die Definition einer neuen Datenquellenfunktion, ConnectionString die Erstellung des Datensatzes und den Aufruf der Odbc.DataSource-Funktion .

[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