3 Stimmen

Ändern der Suche, um sie in SQL Server akzentunempfindlich zu machen

Ich habe eine Datenbank, deren aktuelle Sortierreihenfolge French_CI_AS ist, was bedeutet, dass bei der Suche Groß- und Kleinschreibung keine Rolle spielen, wohl aber der Akzent. Ich hatte den Eindruck, dass die Änderung der Sortierreihenfolge der Datenbank in French_CI_AI mein Problem lösen würde, also habe ich es getan. Allerdings kann ich eine einfache Suche immer noch nicht akzentabhängig machen. Ich habe nachgesehen, und die Sortierreihenfolge der Tabelle ist French_CI_AI, was wahrscheinlich daran liegt, dass sie zusammen mit der Datenbank geändert wurde.

Gibt es eine Möglichkeit, die Suche in allen Datenbanken ohne Akzent zu ermöglichen? Oder gibt es eine Möglichkeit, eine einzelne Suche auf diese Weise durchzuführen? Ich habe nur ein oder zwei Stored Procedures, die das benötigen würden, also könnte ich diesen Weg gehen.

Falls es einen Unterschied macht, der Datentyp, nach dem ich suche, sind alle nvarchar(n)s.

Danke

4voto

Aaron Bertrand Punkte 259330

Sie können für die Suche jede beliebige Sortierung verwenden, z. B.

WHERE column COLLATE FRENCH_CI_AI LIKE '%something%' COLLATE FRENCH_CI_AI

Ich vermute jedoch, dass es besser funktioniert, wenn Sie die Spalte tatsächlich korrigieren (was nicht geschah, als Sie die Sortierung der Datenbank änderten). Die kurze Antwort auf die Frage, wie man das Problem beheben kann, lässt alle Einschränkungen und andere Abhängigkeiten außer Acht:

ALTER TABLE dbo.foo ADD newcol NVARCHAR(32) COLLATE FRENCH_CI_AI;

UPDATE dbo.foo SET newcol = oldcol;

ALTER TABLE dbo.foo DROP COLUMN oldcol;

EXEC sp_rename N'dbo.foo.newcol', N'oldcol', 'COLUMN';

0voto

jboo Punkte 334

Erstens wirkt sich die Änderung der Datenbanksortierung nicht auf vorhandene Tabellenspalten aus, sondern auf neu erstellte Tabellen und Spalten. Es ist die Standard-Sortierreihenfolge, die beim Erstellen neuer Objekte in der Datenbank verwendet wird.

Sie müssen also alle vorhandenen Spalten finden und die aktuelle Sortierung aktualisieren.

Sie können dies mit einem SQL-Cursor tun und alle Tabellen und Spalten abfragen und die Sortierung für einen bestimmten Typ oder Spaltennamen aktualisieren.

Ein Beispiel:

1) Sie ändern die Sortierung für zukünftige Objekte

USE master;
GO
ALTER DATABASE databasename COLLATE French_CI_AI ;
GO

2) manuelle Änderung der Spaltensortierung für eine bestimmte Spalte

 ALTER TABLE tablenameX ALTER COLUMN LastName varchar(100) COLLATE French_CI_AI NULL
 ALTER TABLE tablenameY ALTER COLUMN FirstName varchar(100) COLLATE French_CI_AI NULL

3) ein Sql-Skript mit Cursor erstellen

Sie müssen entscheiden, für welche Spalte die Sortierung geändert werden soll. Dies kann nach Typ, Name oder bestimmter Tabelle erfolgen.

Sie können damit beginnen, indem Sie schauen, welche Art von Zeichen Sie haben und diese im Beispiel ersetzen, siehe die Spalte Cursor.

SELECT distinct DATA_TYPE from information_schema.columns

können Sie sich auf diesen Beitrag beziehen:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

declare @CollationName as nvarchar = 'Latin1_General_CI_AS'

declare @tablename as nvarchar(100) = ''
declare @sqltext as nvarchar(100) = ''
declare @columnname as nvarchar(200) = ''
declare @DataType as nvarchar(100) = ''
declare @CharacterMaxLen as int = 0
declare @IsNullable as bit = 0

DECLARE MyTableCursor Cursor
FOR 
SELECT * from information_schema.TABLES
            WHERE TABLE_TYPE = 'BASE TABLE'
OPEN MyTableCursor
WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE MyColumnCursor Cursor
        FOR 
        SELECT COLUMN_NAME,DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
            IS_NULLABLE from information_schema.columns
            WHERE table_name = @TableName AND  (Data_Type LIKE '%char%' 
            OR Data_Type LIKE '%text%') AND COLLATION_NAME <> @CollationName
            ORDER BY ordinal_position 
        Open MyColumnCursor

        FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType, 
              @CharacterMaxLen, @IsNullable
        WHILE @@FETCH_STATUS = 0
            BEGIN
            SET @SQLText = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN [' + @ColumnName + '] ' + 
              @DataType + '(' + CASE WHEN @CharacterMaxLen = -1 THEN 'MAX' ELSE @CharacterMaxLen END + 
              ') COLLATE ' + @CollationName + ' ' + 
              CASE WHEN @IsNullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
            PRINT @SQLText 

        FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType, 
              @CharacterMaxLen, @IsNullable
        END
        CLOSE MyColumnCursor
        DEALLOCATE MyColumnCursor

FETCH NEXT FROM MyTableCursor INTO @TableName
END
CLOSE MyTableCursor
DEALLOCATE MyTableCursor

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X