Не удается разрешить конфликт сопоставления между «SQL_Latin1_General_CP1_CI_AS» и «Latin1_General_CI_AS» в операции равных - PullRequest
290 голосов
/ 22 октября 2009

У меня есть следующий код

SELECT tA.FieldName As [Field Name],
       COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
       COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
       U.UserName AS [User Name],
       CONVERT(varchar, tA.ChangeDate) AS [Change Date] 
  FROM D tA
       JOIN 
       [DRTS].[dbo].[User] U 
         ON tA.UserID = U.UserID
       LEFT JOIN 
       A tO_A 
         on tA.FieldName = 'AID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
       LEFT JOIN 
       A tN_A 
         on tA.FieldName = 'AID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
       LEFT JOIN 
       B tO_B 
         on tA.FieldName = 'BID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
       LEFT JOIN 
       B tN_B 
         on tA.FieldName = 'BID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
       LEFT JOIN 
       C tO_C 
         on tA.FieldName = 'CID' 
        AND tA.oldValue = tO_C.Name
       LEFT JOIN 
       C tN_C 
         on tA.FieldName = 'CID' 
        AND tA.newValue = tN_C.Name
 WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate

При выполнении кода я получаю сообщение об ошибке, вставленное в заголовок после добавления двух объединений для таблицы C. Я думаю, что это может быть связано с тем фактом, что я использую SQL Server 2008 и восстановил копию этого ДБ на моей машине, которая 2005 года.

Ответы [ 23 ]

3 голосов
/ 04 декабря 2014

Благодаря ответу marc_s я решил свою первоначальную проблему - вдохновился сделать еще один шаг и опубликовать один подход к преобразованию всей таблицы за раз - скрипт tsql для генерации операторов alter column:

DECLARE @tableName VARCHAR(MAX)
SET @tableName = 'affiliate'
--EXEC sp_columns @tableName
SELECT  'Alter table ' + @tableName + ' alter column ' + col.name
        + CASE ( col.user_type_id )
            WHEN 231
            THEN ' nvarchar(' + CAST(col.max_length / 2 AS VARCHAR) + ') '
          END + 'collate Latin1_General_CI_AS ' + CASE ( col.is_nullable )
                                                    WHEN 0 THEN ' not null'
                                                    WHEN 1 THEN ' null'
                                                  END
FROM    sys.columns col
WHERE   object_id = OBJECT_ID(@tableName)

получает: ALTER TABLE Партнерская программа ALTER COLUMN myTable NVARCHAR (4000) COLLATE Latin1_General_CI_AS NOT NULL

Я признаю, что был озадачен необходимостью col.max_length / 2 -

2 голосов
/ 25 января 2018

Если это происходит по всей вашей БД, то лучше изменить параметры сортировки БД следующим образом:

USE master;  
GO  
ALTER DATABASE MyOptionsTest  
COLLATE << INSERT COLATION REQUIRED >> ;  
GO  

--Verify the collation setting.  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'<< INSERT DATABASE NAME >>';  
GO 

Ссылка здесь

2 голосов
/ 24 апреля 2017

Проверьте уровень сопоставления, который не соответствует (сервер, база данных, таблица, столбец, символ).

Если это сервер, эти шаги мне однажды помогли:

  1. Остановить сервер
  2. Найдите инструмент sqlservr.exe
  3. Запустите эту команду:

    sqlservr -m -T4022 -T3659 -s"name_of_insance" -q "name_of_collation"

  4. Запустите ваш sql сервер:

    net start name_of_instance

  5. Еще раз проверьте параметры сортировки вашего сервера.

Подробнее:

https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/

2 голосов
/ 04 июня 2015

Я использовал содержимое этого сайта , чтобы создать следующий скрипт, который изменяет параметры сортировки всех столбцов во всех таблицах:

CREATE PROCEDURE [dbo].[sz_pipeline001_collation] 
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


SELECT 'ALTER TABLE [' + SYSOBJECTS.Name + '] ALTER COLUMN [' + SYSCOLUMNS.Name + '] ' +
SYSTYPES.name + 
    CASE systypes.NAME
    WHEN 'text' THEN ' '
    ELSE
    '(' + RTRIM(CASE SYSCOLUMNS.length
    WHEN -1 THEN 'MAX'
    ELSE CONVERT(CHAR,SYSCOLUMNS.length)
    END) + ') ' 
    END

    + ' ' + ' COLLATE Latin1_General_CI_AS ' + CASE ISNULLABLE WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
    FROM SYSCOLUMNS , SYSOBJECTS , SYSTYPES
    WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID
    AND SYSOBJECTS.TYPE = 'U'
    AND SYSTYPES.Xtype = SYSCOLUMNS.xtype
    AND SYSCOLUMNS.COLLATION IS NOT NULL
    AND NOT ( sysobjects.NAME LIKE 'sys%' )
    AND NOT ( SYSTYPES.name LIKE 'sys%' )

END
2 голосов
/ 26 июня 2018

Добавлен код в ответ @ JustSteve для работы со столбцами varchar и varchar (MAX):

DECLARE @tableName VARCHAR(MAX)
SET @tableName = 'first_notes'
--EXEC sp_columns @tableName
SELECT  'Alter table ' + @tableName + ' alter column ' + col.name
        + CASE ( col.user_type_id )
            WHEN 231
            THEN ' nvarchar(' + CAST(col.max_length / 2 AS VARCHAR) + ') '
            WHEN 167
            THEN ' varchar(' + CASE col.max_length 
                                WHEN -1 
                                THEN 'MAX'
                                ELSE 
                                CAST(col.max_length AS VARCHAR)
                                end
                                 + ') '
          END + 'collate Latin1_General_CI_AS ' + CASE ( col.is_nullable )
                                                    WHEN 0 THEN ' not null'
                                                    WHEN 1 THEN ' null'
                                                  END
FROM    sys.columns col
WHERE   object_id = OBJECT_ID(@tableName)
2 голосов
/ 18 января 2013

Для тех, у кого есть сценарий CREATE DATABASE (как было в моем случае) для базы данных, которая вызывает эту проблему, вы можете использовать следующий сценарий CREATE, чтобы сопоставить параметры сортировки:

-- Create Case Sensitive Database
CREATE DATABASE CaseSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CS_AS -- or any collation you require
GO
USE CaseSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

или

-- Create Case In-Sensitive Database
CREATE DATABASE CaseInSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CI_AS -- or any collation you require
GO
USE CaseInSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

Это применяет желаемое сопоставление ко всем таблицам, что было именно тем, что мне было нужно. Идеально, чтобы попытаться сохранить сопоставление одинаковым для всех баз данных на сервере. Надеюсь, это поможет.

Более подробная информация по следующей ссылке: SQL SERVER - Создание базы данных с разным сопоставлением на сервере

1 голос
/ 08 марта 2018
INSERT INTO eSSLSmartOfficeSource2.[dbo].DeviceLogs  (DeviceId,UserId,LogDate,UpdateFlag) 
SELECT DL1.DeviceId ,DL1.UserId COLLATE DATABASE_DEFAULT,DL1.LogDate 
,0 FROM eSSLSmartOffice.[dbo].DeviceLogs DL1 
WHERE  NOT EXISTS 
(SELECT DL2.DeviceId ,DL2.UserId COLLATE DATABASE_DEFAULT
,DL2.LogDate ,DL2.UpdateFlag 
FROM eSSLSmartOfficeSource2.[dbo].DeviceLogs DL2    
WHERE  DL1.DeviceId =DL2.DeviceId
 and DL1.UserId collate  Latin1_General_CS_AS=DL2.UserId collate  Latin1_General_CS_AS
  and DL1.LogDate =DL2.LogDate )
1 голос
/ 22 ноября 2015

Вы можете легко сделать это, используя 4 простых шага

  1. сделайте резервную копию вашей базы данных, просто добавьте
  2. изменить параметры сортировки базы данных: щелкните правой кнопкой мыши базу данных, выберите свойства, перейдите к параметрам и измените параметры сортировки на требуемые параметры сортировки.
  3. Создание сценария для удаления и повторного создания всех объектов базы данных: щелкните правой кнопкой мыши базу данных, выберите задачи, выберите сценарий создания ... (убедитесь, что вы выбрали «Удалить и создать» в дополнительных параметрах мастера, также выберите «Схема и данные» )
  4. Запустите сценарий, сгенерированный выше
1 голос
/ 12 мая 2014

вот что мы сделали, в нашей ситуации нам нужно выполнить специальный запрос, используя ограничение даты по требованию, и запрос определен в таблице.

Наш новый запрос должен сопоставлять данные между различными базами данных и включать данные из обеих них.

Кажется, что COLLATION отличается от базы данных, которая импортирует данные из системы iSeries / AS400, и от нашей базы данных отчетов - это может быть связано с конкретными типами данных (такими как греческие акценты в именах и т. Д.).

Итак, мы использовали приведенное ниже предложение соединения:

...LEFT Outer join ImportDB..C4CTP C4 on C4.C4CTP COLLATE Latin1_General_CS_AS=CUS_Type COLLATE Latin1_General_CS_AS
1 голос
/ 23 октября 2013

У меня была похожая ошибка (не удалось разрешить конфликт сопоставления между "SQL_Latin1_General_CP1_CI_AS" и "SQL_Latin1_General_CP1250_CI_AS" в операции INTERSECT), когда я использовал старый драйвер jdbc.

Я решил эту проблему, загрузив новый драйвер из Microsoft или проекта с открытым исходным кодом jTDS .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...