영어로 읽기

다음을 통해 공유


Odbc.DataSource에 대한 매개 변수

Odbc.DataSource 함수는 드라이버에 대한 매개 변수와 options 다양한 드라이버 동작을 재정의할 수 있는 레코드라는 두 개의 매개 변수 connectionString 사용합니다. 옵션 레코드를 통해 드라이버에서 보고한 기능 및 기타 정보를 재정의하고, 탐색기 동작을 제어하고, M 엔진에서 생성된 SQL 쿼리에 영향을 줄 수 있습니다.

지원되는 옵션 레코드 필드는 공용이며 항상 사용할 수 있는 범주와 확장성 컨텍스트에서만 사용할 수 있는 두 가지 범주로 구분됩니다.

다음 표에서는 옵션 레코드의 공용 필드에 대해 설명합니다.

필드 설명
CommandTimeout 서버 쪽 쿼리가 취소되기 전에 실행할 수 있는 기간을 제어하는 기간 값입니다.

기본값: 10분
ConnectionTimeout 서버에 대한 연결을 중단하기 전에 대기하는 시간을 제어하는 기간 값입니다.

기본값: 15초
CreateNavigationProperties 반환된 테이블에서 탐색 속성을 생성할지 여부를 설정하는 논리 값입니다. 탐색 속성은 드라이버에서 보고한 외래 키 관계를 기반으로 합니다. 이러한 속성은 쿼리 편집기에서 확장할 수 있는 "가상" 열로 표시되어 적절한 조인을 만듭니다.

외래 키 종속성을 계산하는 것이 드라이버에 대한 비용이 많이 드는 작업인 경우 이 값을 false로 설정할 수 있습니다.

기본값: true
HierarchicalNavigation 스키마 이름으로 그룹화된 테이블을 볼지 여부를 설정하는 논리 값입니다. false로 설정하면 테이블이 각 데이터베이스 아래의 플랫 목록에 표시됩니다.

기본값: false
SqlCompatibleWindowsAuth Windows 인증Trusted_Connection=Yes을 사용할 때 SQL Server 호환 연결 문자열 생성할지 여부를 결정하는 논리 값입니다.

드라이버가 Windows 인증을 지원하지만 연결 문자열 추가 또는 대체 설정이 필요한 경우 이 값을 false로 설정하고 다음 표에 설명된 옵션 레코드 필드를 사용해야 CredentialConnectionString 합니다.

기본값: true

다음 표에서는 확장성을 통해서만 사용할 수 있는 옵션 레코드 필드에 대해 설명합니다. 단순 리터럴 값이 아닌 필드는 이후 섹션에서 설명합니다.

필드 설명
AstVisitor SQL 쿼리 생성을 제어하기 위해 하나 이상의 재정의가 포함된 레코드입니다. 이 필드의 가장 일반적인 사용법은 TOP을 지원하지 않는 드라이버에 대해 LIMIT/OFFSET 절을 생성하는 논리를 제공하는 것입니다.

필드 포함 Constant 및 .LimitClause

추가 정보: AstVisitor 재정의
CancelQueryExplicitly ODBC 서버에 대한 연결을 종료하기 전에 M 엔진이 ODBC 드라이버를 통해 실행 중인 호출을 명시적으로 취소하도록 지시하는 논리적 값입니다.

이 필드는 쿼리 실행이 서버에 대한 네트워크 연결과 독립적으로 관리되는 경우에 유용합니다(예: 일부 Spark 배포). 대부분의 경우 서버에 대한 네트워크 연결이 종료될 때 서버의 쿼리가 취소되므로 이 값을 설정할 필요가 없습니다.

기본값: false
ClientConnectionPooling ODBC 드라이버에 대해 클라이언트 쪽 연결 풀링을 사용하도록 설정하는 논리적 값입니다. 대부분의 드라이버는 이 값을 true로 설정하려고 합니다.

기본값: false
CredentialConnectionString 자격 증명 관련 연결 문자열 속성을 지정하는 데 사용되는 텍스트 또는 레코드 값입니다.
HideNativeQuery 커넥터가 파워 쿼리 사용자 환경에서 생성된 SQL 문을 표시하는지 여부를 제어하는 논리 값입니다. 백 엔드 데이터 원본이 기본적으로 SQL-92를 지원하는 경우에만 true로 설정해야 합니다.

기본값: false
ImplicitTypeConversions 드라이버 또는 백 엔드 서버에서 지원하는 암시적 형식 변환을 포함하는 테이블 값입니다. 이 테이블의 값은 드라이버 자체에서 보고한 변환에 추가됩니다.

이 필드는 일반적으로 드라이버에서 SQLGetTypeInfo 보고한 데이터 형식 정보를 재정의할 때 필드와 함께 사용됩니다.
OnError 형식record의 매개 변수를 errorRecord 수신하는 오류 처리 함수입니다.

이 함수의 일반적인 용도로는 SSL 연결 오류 처리, 시스템에서 드라이버를 찾을 수 없는 경우 다운로드 링크 제공, 인증 오류 보고 등이 있습니다.
SoftNumbers 두 특정 숫자 형식 간의 변환이 SQL_CONVERT_* 기능에서 지원되는 것으로 선언되지 않은 경우 M 엔진에서 호환되는 데이터 형식을 선택할 수 있습니다.

기본값: false
SqlCapabilities 드라이버 기능의 다양한 재정의를 제공하는 레코드 및 ODBC 3.8을 통해 표현되지 않는 기능을 지정하는 방법입니다.

추가 정보: SqlCapabilities 재정의
SQLColumns 함수에서 반환된 열 메타데이터를 수정할 수 있는 함수입니다 SQLColumns .

추가 정보: SQLColumns 재정의
SQLGetFunctions 호출에서 반환된 값을 재정의할 수 있는 레코드입니다 SQLGetFunctions.

이 필드의 일반적인 용도는 매개 변수 바인딩 사용을 사용하지 않도록 설정하거나 생성된 쿼리가 CONVERT 대신 CAST를 사용해야 함을 지정하는 것입니다.

추가 정보: SQLGetFunctions 재정의
SQLGetInfo 호출에서 반환된 값을 재정의할 수 있는 레코드입니다 SQLGetInfo.

추가 정보: SQLGetInfo 재정의
SQLGetTypeInfo 에서 반환 SQLGetTypeInfo하는 형식 정보를 재정의하는 테이블을 반환하는 테이블 또는 함수입니다.

값이 테이블로 설정되면 이 값은 드라이버에서 보고한 형식 정보를 완전히 바꿉니다. SQLGetTypeInfo 는 호출되지 않습니다.

값이 함수로 설정되면 함수는 테이블을 수정할 SQLGetTypeInfo수 있도록 원래 호출 결과를 받습니다.

이 필드는 일반적으로 보고되는 데이터 형식과 SQLColumns데이터 SQLGetTypeInfo 형식이 일치하지 않는 경우에 사용됩니다.

추가 정보: SQLGetTypeInfo 재정의
SQLTables 호출 SQLTables에서 반환된 테이블 메타데이터를 수정할 수 있는 함수입니다.
TolerateConcatOverflow 결과가 사용 가능한 형식의 범위에 맞게 잘릴 수 있더라도 텍스트 값의 연결이 발생할 수 있습니다.

예를 들어 VARCHAR(4000) 필드를 VARCHAR(4000) 필드와 연결하여 VARCHAR 크기가 4000이고 CLOB 형식이 없는 시스템에서 연결하면 결과가 잘리더라도 연결이 접혀집니다.

기본값: false
UseEmbeddedDriver (내부 사용): ODBC 드라이버를 로컬 디렉터리에서 로드해야 하는지 여부를 제어하는 논리 값입니다(ODBC 4.0 사양에 정의된 새 기능 사용). 이 값은 일반적으로 파워 쿼리와 함께 제공되는 Microsoft에서 만든 커넥터에 의해서만 설정됩니다.

false로 설정하면 시스템 ODBC 드라이버 관리자가 드라이버를 찾아서 로드하는 데 사용됩니다.

대부분의 커넥터는 이 필드를 설정할 필요가 없습니다.

기본값: false

AstVisitor 재정의

AstVisitor 필드는 Odbc.DataSource 옵션 레코드를 통해 설정됩니다. 특정 쿼리 시나리오에 대해 생성된 SQL 문을 수정하는 데 사용됩니다.

참고

LIMIT 및 OFFSET 절(TOP이 아닌)을 지원하는 드라이버는 .에 대한 AstVisitor재정의를 LimitClause 제공하려고 합니다.

상수

이 값에 대한 재정의 제공은 더 이상 사용되지 않으며 이후 구현에서 제거될 수 있습니다.

LimitClause

이 필드는 두 개의 Int64.Type 인수(, take)를 수신하고 두 개의 텍스트 필드(skipText, Location)가 있는 레코드를 반환하는 함수입니다.

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

매개 변수는 skip 건너뛸 행 수(즉 OFFSET에 대한 인수)입니다. 오프셋을 지정하지 않으면 건너뛰기 값이 null이 됩니다. 드라이버가 LIMIT를 지원하지만 OFFSET LimitClause 을 지원하지 않는 경우 건너뛰기 값이 0보다 크면 함수가 중요하지 않은 오류(...)를 반환해야 합니다.

매개 변수는 take 취할 행 수(즉 LIMIT에 대한 인수)입니다.

결과 필드에는 Text 생성된 쿼리에 추가할 SQL 텍스트가 포함됩니다.

Location 필드는 절을 삽입할 위치를 지정합니다. 다음 표에서는 지원되는 값에 대해 설명합니다.

설명 예시
AfterQuerySpecification LIMIT 절은 생성된 SQL의 끝에 배치됩니다.

가장 일반적으로 지원되는 LIMIT 구문입니다.
SELECT a, b, c

FROM 테이블

WHERE a > 10

제한 5
BeforeQuerySpecification LIMIT 절은 생성된 SQL 문 앞에 배치됩니다. 5개 행 제한

SELECT a, b, c

FROM 테이블

WHERE a > 10
AfterSelect LIMIT는 SELECT 문 뒤와 모든 한정자(예: DISTINCT) 뒤에 갑니다. SELECT DISTINCT LIMIT 5 a, b, c

FROM 테이블

WHERE a > 10
AfterSelectBeforeModifiers LIMIT는 SELECT 문 뒤에 있지만 모든 한정자(예: DISTINCT) 앞에 갑니다. SELECT LIMIT 5 DISTINCT a, b, c

FROM 테이블

WHERE a > 10

다음 코드 조각은 다음 형식의 선택적 OFFSET과 함께 LIMIT 절이 필요한 드라이버에 대한 LimitClause 구현을 제공합니다. [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"
        ]

다음 코드 조각은 LIMIT를 지원하지만 OFFSET은 지원하지 않는 드라이버에 대한 구현을 제공합니다 LimitClause . 형식: 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 재정의

필드 세부 정보
FractionalSecondsScale 밀리초 값에 지원되는 소수 자릿수를 나타내는 1에서 7 사이의 숫자 값입니다. 이 값은 날짜/시간 값에 대해 쿼리 폴딩을 사용하도록 설정하려는 커넥터에 의해 설정되어야 합니다.

기본값: null
PrepareStatements SQLPrepare을 사용하여 문을 준비해야 임을 나타내는 논리 값입니다.

기본값: false
SupportsTop 드라이버가 TOP 절을 지원하여 반환된 행 수를 제한하도록 나타내는 논리 값입니다.

기본값: false
StringLiteralEscapeCharacters 문자열 리터럴 및 LIKE 식을 이스케이프할 때 사용할 문자를 지정하는 텍스트 값 목록입니다.

예: {""}

기본값: null
SupportsDerivedTable 드라이버가 파생 테이블(하위 선택)을 지원한다는 것을 나타내는 논리 값입니다.

이 값은 규칙 수준을 SQL_SC_SQL92_FULL(드라이버에서 보고하거나 Sql92Conformance 설정으로 재정의된) 드라이버의 경우 true로 간주됩니다. 다른 모든 규칙 수준의 경우 이 값은 기본값이 false입니다.

드라이버가 SQL_SC_SQL92_FULL 준수 수준을 보고하지 않지만 지원 파생 테이블을 수행하는 경우 이 값을 true로 설정합니다.

여러 DirectQuery 시나리오에서는 파생 테이블을 지원해야 합니다.
SupportsNumericLiterals 생성된 SQL에 숫자 리터럴 값이 포함되어야 하는지 여부를 나타내는 논리 값입니다. false로 설정하면 항상 매개 변수 바인딩을 사용하여 숫자 값이 지정됩니다.

기본값: false
SupportsStringLiterals 생성된 SQL에 문자열 리터럴 값이 포함되어야 하는지 여부를 나타내는 논리 값입니다. false로 설정하면 항상 매개 변수 바인딩을 사용하여 문자열 값이 지정됩니다.

기본값: false
SupportsOdbcDateLiterals 생성된 SQL에 날짜 리터럴 값이 포함되어야 하는지 여부를 나타내는 논리 값입니다. false로 설정하면 날짜 값은 항상 매개 변수 바인딩을 사용하여 지정됩니다.

기본값: false
SupportsOdbcTimeLiterals 생성된 SQL에 시간 리터럴 값이 포함되어야 하는지 여부를 나타내는 논리 값입니다. false로 설정하면 시간 값은 항상 매개 변수 바인딩을 사용하여 지정됩니다.

기본값: false
SupportsOdbcTimestampLiterals 생성된 SQL에 타임스탬프 리터럴 값이 포함되어야 하는지 여부를 나타내는 논리 값입니다. false로 설정하면 타임스탬프 값은 항상 매개 변수 바인딩을 사용하여 지정됩니다.

기본값: false

SQLColumns 재정의

SQLColumns 는 SQLColumns에 대한 ODBC 호출의 결과를 수신하는 함수 처리기입니다. 원본 매개 변수에는 데이터 형식 정보가 포함된 테이블이 포함되어 있습니다. 이 재정의는 일반적으로 호출과 SQLColumns호출 간의 데이터 형식 불일치를 SQLGetTypeInfo 해결하는 데 사용됩니다.

원본 테이블 매개 변수 형식에 대한 자세한 내용은 SQLColumns 함수참조하세요.

SQLGetFunctions 재정의

이 필드는 ODBC 드라이버에서 반환된 값을 재정 SQLFunctions 의하는 데 사용됩니다. 필드 이름이 ODBC SQLGetFunctions 함수에 대해 정의된 상수와 같은 FunctionId 레코드를 포함합니다. 이러한 각 필드에 대한 숫자 상수는 ODBC 사양에서 찾을 수 있습니다.

필드 세부 정보
SQL_CONVERT_FUNCTIONS 형식 변환을 수행할 때 지원되는 함수를 나타냅니다. 기본적으로 M 엔진은 CONVERT 함수를 사용하려고 시도합니다. CAST를 사용하는 것을 선호하는 드라이버는 이 값을 재정의하여 SQL_FN_CVT_CAST(0x2 숫자 값)만 지원된다는 것을 보고할 수 있습니다.
SQL_API_SQLBINDCOL 매시업 엔진이 데이터를 검색할 때 SQLBindCol API사용해야 하는지 여부를 나타내는 논리(true/false) 값입니다. false 로 설정하면 SQLGetData 가 대신 사용됩니다.

기본값: false

다음 코드 조각은 M 엔진에 CONVERT 대신 CAST를 사용하도록 명시적으로 알리는 예제를 제공합니다.

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

SQLGetInfo 재정의

이 필드는 ODBC 드라이버에서 반환된 값을 재정 SQLGetInfo 의하는 데 사용됩니다. ODBC SQLGetInfo 함수에 대해 정의된 상수와 이름이 같은 InfoType 필드의 레코드가 포함됩니다. 이러한 각 필드에 대한 숫자 상수는 ODBC 사양에서 찾을 수 있습니다. 검사 있는 전체 목록은 InfoTypes 매시업 엔진 추적 파일에서 찾을 수 있습니다.

다음 표에는 일반적으로 재정의된 SQLGetInfo 속성이 포함되어 있습니다.

필드 세부 정보
SQL_SQL_CONFORMANCE 드라이버에서 지원하는 SQL-92의 수준을 나타내는 정수 값입니다.

(1) SQL_SC_SQL92_ENTRY: 항목 수준 SQL-92 규격입니다.
(2) SQL_SC_FIPS127_2_TRANSITIONAL: FIPS 127-2 전환 수준 준수.
(4) SQL_SC_ SQL92_INTERMEDIATE" 중간 수준 SQL-92 규격.
(8) SQL_SC_SQL92_FULL: 전체 수준 SQL-92 규격.

파워 쿼리 시나리오에서 커넥터는 읽기 전용 모드에서 사용됩니다. 대부분의 드라이버는 SQL_SC_SQL92_FULL 준수 수준을 보고하고 해당 및 SQLGetFunctions 속성을 사용하여 특정 SQL 생성 동작을 재정의 SQLGetInfo 하려고 합니다.
SQL_SQL92_PREDICATES SQL-92에 정의된 대로 SELECT 문에서 지원되는 조건자를 열거하는 비트 마스크입니다.

ODBC 사양에서 SQL_SP_* 상수로 이동합니다.
SQL_AGGREGATE_FUNCTIONS 집계 함수에 대한 비트 마스크 열거형 지원입니다.

SQL_AF_ALL
SQL_AF_AVG
SQL_AF_COUNT
SQL_AF_DISTINCT
SQL_AF_MAX
SQL_AF_MIN
SQL_AF_SUM

ODBC 사양에서 SQL_AF_* 상수 로 이동합니다.
SQL_GROUP_BY GROUP BY 절의 열과 선택 목록의 집계되지 않은 열 간의 관계를 지정하는 정수 값입니다.

SQL_GB_COLLATE: 각 그룹화 열의 끝에 COLLATE 절을 지정할 수 있습니다.

SQL_GB_NOT_SUPPORTED: GROUP BY 절은 지원되지 않습니다.

SQL_GB_GROUP_BY_EQUALS_SELECT: GROUP BY 절은 선택 목록에 집계가 아닌 모든 열을 포함해야 합니다. 다른 열은 포함할 수 없습니다. 예를 들어 SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT.

SQL_GB_GROUP_BY_CONTAINS_SELECT: GROUP BY 절은 선택 목록에 집계가 아닌 모든 열을 포함해야 합니다. 선택 목록에 없는 열을 포함할 수 있습니다. 예를 들어 SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT, AGE.

SQL_GB_NO_RELATION: GROUP BY 절 및 선택 목록의 열은 관련이 없습니다. 선택 목록에서 그룹화되지 않은 집계되지 않은 열의 의미는 데이터 원본에 따라 다릅니다. 예를 들어 SELECT DEPT, SALARY FROM EMPLOYEE GROUP BY DEPT, AGE.

ODBC 사양에서 SQL_GB_* 상수 로 이동합니다.

다음 도우미 함수를 사용하여 정수 값 목록에서 비트 마스크 값을 만들 수 있습니다.

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 재정의

SQLGetTypeInfo 은 다음 두 가지 방법으로 지정할 수 있습니다.

  • ODBC 호출과 동일한 형식 정보를 포함하는 고정 table 값입니다 SQLGetTypeInfo.
  • 테이블 인수를 수락하고 테이블을 반환하는 함수입니다. 인수에는 ODBC 호출의 원래 결과가 포함됩니다 SQLGetTypeInfo. 함수 구현은 이 테이블을 수정하거나 추가할 수 있습니다.

첫 번째 방법은 ODBC 드라이버에서 반환된 값을 완전히 재정의하는 데 사용됩니다. 두 번째 방법은 이러한 값을 추가하거나 수정하려는 경우에 사용됩니다.

형식 테이블 매개 변수 및 예상 반환 값 형식에 대한 자세한 내용은 SQLGetTypeInfo 함수 참조이동하세요.

정적 테이블을 사용하는 SQLGetTypeInfo

다음 코드 조각은 에 대한 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

다음 코드 조각은 드라이버에서 bpchar 반환하는 기존 형식에 형식을 추가합니다.

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;

연결 문자열 설정

ODBC 드라이버에 대한 연결 문자열 Odbc.DataSourceOdbc.Query 함수에 대한 첫 번째 인수를 사용하여 설정됩니다. 값은 텍스트 또는 M 레코드일 수 있습니다. 레코드를 사용하는 경우 레코드의 각 필드는 연결 문자열 속성이 됩니다. 모든 연결 문자열 필드(또는 DSN 사용자가 시스템 수준 DSN을 미리 구성해야 하는 경우 필드)가 필요합니다Driver. 자격 증명 관련 속성은 별도로 설정됩니다. 다른 속성은 드라이버 관련입니다.

아래 코드 조각은 새 데이터 원본 함수의 정의, 레코드 만들기 ConnectionString 및 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;

다음 단계