none
Access 2013 Datensatzsuche über Kombinationsfeld MSSQL ß und ss

    Frage

  • Hallo

    ich habe das Problem wenn ich einen Datensatz suche der im Suchbegriff ein ß enthält er mir diesen auch im Kombinationsfeld in Access auch anzeigt wenn ich einen "ähnlichen" suche mit ss

    Bsp.

    Ich gebe im Kombinationsfeld Janssen ein dann zeigt er mir im Kombinationsfeld auch Janßen an schreibt diesen dann aber als Janssen.

    Genau das möchte ich aber nicht -  bei Janß möchte ich alle Janßen bekommen und bei Janss alle Janssen

    Datensatzherkunft ist allerdings der MSSQL Server(2008R2 oder 2012) Anbindung über {SQL Server Native Client 11.0} (geht auch nicht anders da ich die Datenbank an diesen angepasst habe Datum...)

    Michael

    Freitag, 20. März 2015 08:01

Antworten

Alle Antworten

  • Hallo,

    "ß" wird beim Vergleich wie "ss" behandelt[1]. Wenn Du das nicht willst, musst Du binär vergleichen. Auf SQL Server Seite:

    CREATE TABLE #t (name nvarchar(50) COLLATE Latin1_General_CI_AS);
    
    INSERT INTO #t (name) VALUES(N'Janssen'), (N'Janßen'), (N'Jansen');
    
    SELECT * FROM #t WHERE name = N'Janssen' COLLATE Latin1_General_CI_AS;
    SELECT * FROM #t WHERE name = N'Janssen' COLLATE Latin1_General_BIN;
    SELECT * FROM #t WHERE name LIKE N'Jans%' COLLATE Latin1_General_CI_AS;
    DROP TABLE #t;

    Bei Access mit Option Compare Binary bzw. StrComp mit Binär-Vergleich, siehe z. B.:

    ACC: Unterscheidung von Groß- und Kleinschreibung in Abfragen.

    Gruß Elmar

    [1] Michael Kaplan (leider nicht mehr im MSDN Blog):
    Every character has a story #15: CAPITAL SHARP S (not encoded).

    What the %#$* is wrong with German sorting? (.NET verwendet die Unicode Tabellen des Betriebssystems wie der SQL Server und Access)

    Freitag, 20. März 2015 08:30
  • Wobei im Fall ss/ß diese nur bei einer Windows Collation als gleich behandelt werden, nicht bei einer SQL Server Collation:

    ;WITH cte AS
        (SELECT 'Janssen' AS Name
         UNION SELECT 'Janßen')
    SELECT *
    FROM cte
    WHERE Name LIKE '%ß%' COLLATE Latin1_General_CI_AS;
    
    ;WITH cte AS
        (SELECT 'Janssen' AS Name
         UNION SELECT 'Janßen')
    SELECT *
    FROM cte
    WHERE Name LIKE '%ß%' COLLATE SQL_Latin1_General_CP1_CI_AS
    


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 20. März 2015 08:44
  • Hallo Olaf,

    nichts für ungut, aber Deine CTEs haben das Problem, dass sie kein UNION ALL verwenden, damit werden Janssen und Janßen zusammengefasst, wenn der Sortierung des Zeichensatz der Datenbank es für die Konstante es vorgibt, zum Vergleich:

    -- liefert Janssen
    WITH cte AS
        (SELECT 'Janssen' COLLATE Latin1_General_CI_AS AS Name
         UNION SELECT 'Janßen' COLLATE Latin1_General_CI_AS)
    SELECT * FROM cte;
    
    -- liefert Janssen und Janßen
    WITH cte AS
        (SELECT 'Janssen'  COLLATE SQL_Latin1_General_CP1_CI_AS AS Name
         UNION SELECT 'Janßen'  COLLATE SQL_Latin1_General_CP1_CI_AS)
    SELECT * FROM cte;
    

    Was IMO nur zeigt wie komplex die Geschichte werden kann. Und man es einfach halten sollte, will man  durchblicken.

    Gruß Elmar

    Freitag, 20. März 2015 09:34
  • Elmar, wo Du Recht hast, hast Du Recht.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 20. März 2015 10:16