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
tableWert, der die gleichen Typinformationen wie ein ODBC-Aufruf von enthältSQLGetTypeInfo. - 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;