Tabelnamen ineens in hoofdletters i.p.v. mixed case op SQL server

Sinds een tijdje hebben we een script draaien in Invantive cloud om gegevens van Exact Online naar een SQL server in Azure te schrijven. Sinds een aantal weken lijken de tabelnamen ineens in hoofdletters (all caps) aangepast en een aantal kolommen zijn ook verschillend in hoofdletters. Gezien er van onze kant niks aangepast is lijkt het erop dat dit door update vanuit Invantive oid. Door de hoofdletters krijg ik nu foutmeldingen in Power BI.
Setup: we hebben een applicatie die voor elke tabel een ‘create or replace’ script b.v.:

create or replace table ProjectsIncremental@mss
as
select *
from   ProjectsIncremental@eol

In de SQL Server database is dit nu tabel : “PJTTIMETRANSACTIONSINCREMENTAL” ipv van voorheen Camel/Pascal case: “PjtTimeTransactionsIncremental”
Opmerkelijk is dat de originele tabellen wel verwijderd zijn dus het script ziet dit blijkbaar als dezelfde, in SQL server dit dus wel aangepast is.

Is er een reden waarom deze verandering optreed? Is dit eventueel terug te draaien?

Er zijn afgelopen week een aantal releases geweest (zie Invantive(R) SQL 22.0.629 | Release Notes voor volledige historie) die de SQL Server-driver aanpasten voor betere compatibiliteit met niet-Nederlandse en niet-Engelse omgevingen.

Kunt u met de stand van vandaag aangeven:

  • wat is de nieuwe naam?
  • wat is het exacte create table-statement dat bij PjtTimeTransactionsIncremental hoort?

Ik heb de link met de release notes doorgenomen. Daar kan ik wel wat veranderingen vinden in verband met camel casing, maar dit zijn aanpassingen van langer geleden. Ik was zelf offline de afgelopen weken, maar ik heb idee dat het probleem ontstaan is ergens binnen de afgelopen maand.

Het voorbeeld dat ik aanhaalde een geselecteerde case, maar het lijkt op alle tabellen te slaan. Als via de Invantive website kijk naar de beschikbare objecten in de Exact Online heeft het nog de originele benaming. Een aantal voorbeelden van de veranderde namen:

  • AccountsIncremental → ACCOUNTSINCREMENTAL
  • ActiveEmployments → ACTIVEEMPLOYMENTS
  • Employments → EMPLOYMENTS
  • PjtTimeTransactionsIncremental → PJTTIMETRANSACTIONSINCREMENTAL
  • ProjectsIncremental → PROJECTSINCREMENTAL
  • ProjectTimeTransactionHourStatuses → PROJECTTIMETRANSACTIONHOURSTATUSES

Het script staat in mijn eerdere opening post. Voor elke tabel is het hetzelfde script behalve de benamingen die aangepast zijn. Het lijkt te onstaan bij het uitvoeren van de “create or replacee”-stap.
Zover ik weet staan zowel Invantive als Exact beiden op Engels ingesteld.

Achtergrond

Vanaf release 22.0.617 is er een wijziging doorgevoerd in de SQL Server-driver om de compatibiliteit met niet-Nederlandse en niet-Engelse omgevingen te verbeteren:

Set SQL Server identifier casing to mixed, fixing issues with non-ASCII identifier characters.

Onderdeel van deze wijziging is dat namen van identifiers op een andere wijze tot stand komen. Standaard volgt Invantive SQL voor de namen van identifiers zoals tabellen de ANSI SQL-standaard waarbij namen - tenzij anders aangegeven - hoofdletters worden. Normaliter is dat voor queries op SQL Server geen probleem; bij verre de meeste databases hebben case-insensitive metadata waardoor SQL-statements blijven werken.

Echter, er is geen rekening mee gehouden dat Power BI op dit gebied gevoeliger is dan SQL Server zelf en de case-insensitivity niet overneemt. Het veranderen van casing of weglaten van niet-gebruikte velden veroorzaakt daardoor foutmeldingen.

Deze veranderde werkwijze is zichtbaar in het resultaat de volgende statements:

create or replace table SampleTable1
as
select * from dual@datadictionary

create or replace table sampletable2
as
select * from dual@datadictionary

create or replace table [SampleTable3]
as
select * from dual@datadictionary

met als resultaat:

image

Advies

Als het gewenst is om de casing te behouden zoals die in het create or replace table-statement staat, gelieve dan de tabelnaam tussen vierkante haken te plaatsen zoals in bovenstaand voorbeeld bij SampleTable3. Dit wordt dan behandeld conform SQL-standaard als een specifiek gewenste casing.

In het eerst genoemde statement wordt dit dan:

create or replace table [ProjectsIncremental]@mss
as
select *
from   ProjectsIncremental@eol

De vierkante haken werkt inderdaad voor de haakjes werkt inderdaad voor de tabelnamen. Echter, de kolomnamen blijven nog steeds anders dan voorheen. In jullie uitgebreide antwoord lees ik ook dat de huidige (nieuwe) manier volgens de ANSI standaard is en de oude daar van af wijkt.

Gelukkig heb ik nog niet veel rapporten gebruikt dus zou ik nu nog kunnen aanpassen en de ANSI standaard aanhouden. Ik ga er van uit dat er voorlopig de ANSI -standaard dan voorlopig en dit naar de toekomst dan ook de meest stabiele oplossing is.

Edit: Ik bedenk mij net dat ik eventueel ipv de SELECT * ook de specifieke kolomn namen zou kunnen specificeren met vierkante haakjes. Ik denk dat ik zelf toch het aanpassen ga om meer toekomstbestendig te zijn.

Welke veranderingen zijn er nog in de kolomnamen?

Ik had eerder geen tijd om dit even uit te zoeken ivm deadliens. De kolomn namen hebben ook een verandering in hoofdletters. Deze worden naar Camel/Pascal case omgezet. Hierdoor kan Power Bi de kolommen niet vinden omdat deze hoofdletter gevoelig is. Bijvoorbeeld “quantity” is nu “Quantity” geworden.
Dan zou je waarschijnlijk binnen invantive kunnen oplossen door niet de asterix (*) te gebruiken maar de kolomnamen te specificeren bv SELECT Quantity as quantity etc
Ik heb dit zelf nog niet getest maar zie zo snel niet waarom dat niet zo werken. Zoals ik hierboven aangaf had ik nog niet te veel rapportages aangemaakt en zal ik deze aanpassen naar de nieuwe benaming waarmee het hopelijk dan het meest robuust/toekomstbestendig is.