web-dev-qa-db-fra.com

Comment changer le classement SQL Server

Comment pourrais-je changer le classement par défaut de SQL Server 2008 R2 Express pour l'ensemble du serveur et une base de données particulière?

Existe-t-il un moyen de le faire en utilisant l'interface visuelle de SQL Server Management Studio? Dans la fenêtre Propriétés du serveur (et dans la fenêtre Propriétés de la base de données correspondante), cette propriété n'est pas disponible pour modification.

27
rem

Oui.

Vous pouvez modifier le classement par défaut de l'instance express SQL Server 2008 R2 et des bases de données individuelles, mais c'est une tâche complexe.

Malheureusement, il n'y a pas d'option visuelle pour le faire via SSMS.

SQL Server 2008 prend en charge la définition de classements aux niveaux suivants:

  • Serveur

  • Base de données

  • Colonne

  • Expression

Les paramètres d'installation par défaut sont déterminés par les paramètres régionaux du système Windows. Le classement au niveau du serveur peut être modifié lors de l'installation ou en modifiant les paramètres régionaux du système Windows avant l'installation. plus ...

Définition et modification du classement du serveur - SQL Server 2008

  • Assurez-vous que vous disposez de toutes les informations ou scripts nécessaires pour recréer vos bases de données utilisateur et tous les objets qu'elles contiennent.

  • Exportez toutes vos données à l'aide d'un outil tel que l'utilitaire bcp. Pour plus d'informations, voir Importation et exportation de données en masse.

  • Supprimez toutes les bases de données utilisateur.

  • Reconstruire la base de données master spécifiant le nouveau classement dans la propriété SQLCOLLATION de la commande setup

  • Créez toutes les bases de données et tous les objets qu'elles contiennent.

  • Importez toutes vos données.

Définition et modification du classement de la base de données - SQL Server 2008

  • Définissez l'option COLLATION dans CREATE DATABASE instruction lors de la création d'une nouvelle base de données.
  • De même, définissez les options COLLATION dans ALTER DATABASE instruction pour modifier le classement d'une base de données existante.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Définition et modification du classement des colonnes

  • Certains des classements de colonnes resteront les mêmes même après avoir modifié le classement de la base de données. Dans ce cas, vous devez modifier le classement des colonnes individuelles.
25
CoderHawk

Assurez-vous que vous voulez vraiment "supprimer" les bases de données utilisateur comme indiqué dans la réponse ci-dessus. Vous voudrez peut-être simplement "détacher" les bases de données. Ou vraiment, vous ne pouvez rien faire car la reconstruction du maître supprime efficacement tous les liens vers les bases de données utilisateur. Il y a des moments où les bases de données sont créées dans le classement souhaité, mais pas le serveur. Dans ce cas, vous ne voudriez pas avoir à récupérer toutes vos bases de données utilisateur à partir de sauvegardes.

6
AndrewSQL

J'ai fait quelque chose comme ça et cela a fonctionné, mais vous devez garder à l'esprit les index qui pointent vers le type de données car text/varchar/nvarchar doivent être supprimés, exécuter le script puis créer les index.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

ceci est ma première réponse posté pardon mon désordre

5
Jeffry