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 record erhä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 SQLGetFunctions zurü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 SQLGetInfo zurückgegebenen Werte überschreiben können.Weitere Informationen: Überschreiben von SQLGetInfo |
SQLGetTypeInfo |
Eine Tabelle oder Funktion, die eine Tabelle zurückgibt, die die von SQLGetTypeInfo zurü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 SQLColumns gemeldeten Datentypen gibt.Weitere Informationen: Überschreiben von SQLGetTypeInfo |
SQLTables |
Eine Funktion, mit der Sie die durch einen Aufruf von SQLTables zurü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 |
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 AstVisitor
anbieten.
Die Bereitstellung einer Überschreibung für diesen Wert ist veraltet und wird möglicherweise aus zukünftigen Implementierungen entfernt werden.
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"
]
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
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 SQLColumns
zu beheben.
Einzelheiten zum Format der Parameter der Quelltabelle finden Sie unter SQLColumns Function.
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 */
]
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;
SQLGetTypeInfo
kann auf zwei Arten angegeben werden:
- Ein fester Wert
table
, der die gleichen Typinformationen enthält wie ein ODBC-Aufruf anSQLGetTypeInfo
. - 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.
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 } }
);
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;
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;