Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MS SQL Spaltenname mit case sensitivity
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 428
Herkunft: Germany

Themenstarter:

MS SQL Spaltenname mit case sensitivity

beantworten | zitieren | melden

Hallo liebe Community, stehe gerade vor folgendem Problem.
Ich muss Maschinendaten in eine SQL-Datenbank transferieren. Dabei ist mir aufgefallen, das der Hersteller manchmal Namen vergibt (Parameternamen welche dann als Spaltennamen benutzt werden) , die aus Buchstaben bestehen, aber einmal als "Durchmesser-a" und anderes mal als "Durchmesser-A" beschrieben werden. Beide Parameter haben eine andere Bedeutung, aber mit der aktuellen Einstellung kann ich die Spalte "Durchmesser-A" nicht anlegen, weil der SQL-Server motzt und sagt es gibt diese Spalte schon in der Tabelle "Durchmesser-a".
Deshalb meine frage, wo kann ich das einstellen. Habe schon im Netz dazu gesucht, aber ich finde nichts passendes.
Kann ich das überhaupt nachträglich ändern, oder muss das der komplette SQL-Server neu aufgesetzt werden?
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.358

beantworten | zitieren | melden

Laut Column Names Case Sensitive sowie den (unteren) Kommentaren in SQL Server Column names case sensitivity ist dafür die Collation der Database verantwortlich:

ALTER DATABASE {db_name} COLLATE {new_collation} 
wobei im Collation-Name dann "CI" für case-insensitive und "CS" für case-sensitive steht.
Die komplette Liste der Collations kannst du so ermitteln:

SELECT * FROM fn_helpcollations()
(z.B. "LATIN1_..._CI_...")

Ich weiß allerdings nicht, ob damit automatisch nicht auch die Daten (in den Tabellen) dann als case-insensitive behandelt werden?!
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 428
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo, danke für die Antwort.
Ich habe das gerade bei einer bestehenden lokalen Datenbank getestet. Habe die in den SingelUser geschaltet, und dann unter Options
die Collation in dem DropDown-Menu von Latin1_General_CI_AI auf Latin1_General_CS_AI gesetzt.

Davor hatte ich in einer Tabelle eine Spalte mit Durchmesser-a angelegt.
Nach der obigen Änderung habe ich nochmal versucht, in der Tabelle eine weitere Spalte mit Durchmesser-A anzulegen. Es kam dann die Fehlermeldung, das diese Spalte schon existiert.
Was ist falsch?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Konzeptionell behandelst Du hier ein Symptom, löst aber nicht die Ursache des Problems.
Lass die Maschinen nicht blind in die Datenbank pumpen, weil sonst passiert schnell das, was Du jetzt hast: Inkompatibilitäten.
Das jemals wieder zu fixen: viel Spaß.
Gib den Maschinen eine Schnittstelle; wenn schon nicht auf API Basis (REST, gRPC..), dann wenigstens als Stored Proc.
Dann kannst Du auch ein Name Mapping (zB durch einen Provider Pattern aufbauen).
Hab den gleichen Käse mal bei nem namhaften Maschinenbauer fixen "dürfen" - den Ärger und die Kosten kann man sich sparen :-)

Ich mag mich gerade arg täuschen, aber meines Wissens reicht es nicht die Collation einer DB zu ändern.
Server Identifiers müssten IIRC über die Instanz-Collation Settings (also den DB Server) beim Setup mitgegeben werden.

Aber wie gesagt: hiermit wird nicht das eigentliche Probleme hier gelöst, sondern ein Symptom.
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 428
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo Abt, ja du weisst schon, es geht um Maschinenprogramme ;-).
Der Hersteller speichert dieses auch (in SQLITE, da geht es doch wohl auch...).
Ich muss die Programme über einen WebService ansprechen, kann die Daten dann abgreifen. Dann brösle ich das alles in seine Bestandteile auf und übertrage das in die Datenbank. Neue Tabellen, Spalten werden automatisch angelegt. Aber, wie ich dann trotzdem Spaltennamen die identische Zeichnen haben aber sich in Groß-Kleinschrift unterscheiden, verstehe ich nicht. Es ist wahrschleinlich deswegen, weil ich kein Informatikstudium gemacht habe.
Und ich dachte ich hatte auch mal etwas gelesen, das man diese Eigenheit beim SMS einstellen kann.
Also, wenn ich automtisch per Code eine neue Spalten anlegen lassen will, muss der SQL-Server / Datenbank unterscheiden zwischen "Durchmesser-A" und "Durchmesser-a".
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Zitat von oehrle
Und ich dachte ich hatte auch mal etwas gelesen, das man diese Eigenheit beim SMS einstellen kann.
Das ist keine Eigenheit, sondern das korrekte Vorgehen; alleinaus Domänensicht. Die Eigenheit ist euer Thema da - ich würd sogar als konzeptionellen Fehler betiteln; eben weil ich solche Systeme schon aufwändig reparieren musste.
Kein Mensch kann erkennen, dass sich die Bedeutung von Werten nur anhand der Groß- und Kleinschreibung unterscheidet - auch Nicht-Imformatiker :-)
Wer soll das denn in 5 Jahren noch wissen? Folgefehler sind da vorprogrammiert.

Am Ende läuft das unter Normalisierung (Datenbank).
Das heisst, Du musst einen generischen Datenbank-Aufbau machen - und dann Schnittstellen schaffen, die die Eindeutigkeit von Werten herstellen kann.
Bei Maschinen macht man das leider oft pro Maschine / Version; selten pro Hersteller.
Das heisst: Du musst wissen das Wert A von Maschine 6 "XYZ" bedeutet. Bei Hersteller O bedeutet Wert F aber XYZ.

Im Endeffekt funktioniert technisch jeder Datenbank-Provider von großen Frameworks so:
Aus .NET Developersicht erstellst Du einfach eine "Datenbank"-Verbindung, und je nachdem welche DB Typ das ist..


IDbConnection connection = new MySqlConnection("...");
IDbConnection connection = new MssqqlConnection("...");
IDbConnection connection = new Oracle("...");

Bei Dir dann halt:
- "Durchmesser-A" von Maschine 1 bedeutet zB "Durchmesser Gesamt"
- "Durchmesser-a" von Maschine R bedeutet jedoch "Durchmesser Bohrkopf"
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 428
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Danke Abt, dass du dir die Zeit nimmst und mir das anschaulich erklärst.
Du denkst jetzt da schon einen Schritt weiter, das da verschiedene Hersteller / Systeme von Maschinenherstellern angesprochen werden. Es geht hier bei mir aber nurm um einen Hersteller, da kommt sonst nichts rein, was sich vermischen kann. Es geht um einen schweizer Schleifmaschinenhersteller, der hat seine Schleifsoftware und von dieser lege ich nur Daten ab.
Ich weiss aber was du meinst, wenn verschiedene Hersteller hier in der DB drin wären , dann bräuchte ich eine Mappingtabelle, das die Parameter genau und eindeutig zu identifizieren sind. Ja, man könnte auch die Logik eventuelle für andere Systeme anpassen, ableiten (Vererben).

Also, bei den Daten die ich hier archiviere, ist der Parameter an allen Maschinen identisch.
Aber zu meiner Frage, kann man den Spaltennamen im Microsoft SQLserver nun so einstellen, das er "Durchmesser-A" und "Durchmesser-a" anlegen kann ??
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Zitat von Abt
Server Identifiers müssten IIRC über die Instanz-Collation Settings (also den DB Server) beim Setup mitgegeben werden.
Siehe Docs: https://docs.microsoft.com/en-us/sql/relational-databases/collations/set-or-change-the-server-collation

Kann auch sein, dass das schon der Trick ist:

CREATE DATABASE [MyDb]
COLLATE Latin1_General_BIN;
GO 
USE [MyDb];
GO 

Dann dürfte mydb nicht existieren, aber MyDb.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.764
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden


Spaltennamen automatisch nach Parametern anzulegen finde ich gefährlich.

Es gibt zum einen Sonderzeichen die einem das Leben schwer machen können und auch reservierte Wörter.

Ich würde auch ein Mapping durchführen dass die Parameter Namen auf gültige Spaltennamen mappt.

Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 428
Herkunft: Germany

Themenstarter:

Gelöst, es klappt

beantworten | zitieren | melden

Danke Abt für deinen Typ, das funktioniert (jedenfalls lokal, ob in der Firma auch muss ich noch checken).
Ist mir schon klar, mit Sonderzeichen usw. Aber das machen die auch nicht, weil denen ihr Programm eingentlich ein SQLITE-Datenfile ist, also haben die auch bestimmte Regeln.
Mir geht es darum, dass die Programme schnell und übersichtlich gefiltert, sortiert, verglichen werden können, deshalb diese Sache. Habe davor schon ohne diese Ooption die Programme verarbeitet, musste aber bei so einem Fall, wenn "Durchmesser-a" schon da war und dann noch "Durchmesser-A" in einem Programm vorhanden war, die Spalte mir einem Zähler versehen.
Aber so sollte das klappen.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Bleibt trotzdem eine tickende Zeitbombe.
Alles nur eine Frage der Zeit, bis das hoch geht.
private Nachricht | Beiträge des Benutzers