2010-09-27 2 views
6

Я всегда получал сообщение «Не удается разрешить конфликт сортировки между« SQL_Latin1_General_CP1_CI_AS »и« Latin1_General_CI_AI »в равном действию». , когда я запускаю скрипт, который пришел с сервера MSSQL 2005. Кстати я использовал MSSQL 2008.Collation Conflict

здесь это скрипт

USE [database1] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
--exec rsp_SOA '', '', '', '', '', '', '40050000', '40050000', '05/01/2010', '05/31/2010', '000-00','Dont Show Note' 

ALTER procedure [dbo].[rsp_SOA] 
    @cCompName VARCHAR(100) , 
    @cAddress1 VARCHAR(200) , 
    @cAddress2 VARCHAR(200), 
    @cReportTitle VARCHAR(200), 
    @cCriteria1 VARCHAR(200), 
    @cCriteria VARCHAR(200), 

    @cFrom VARCHAR(25), 
    @cTo VARCHAR(25), 
    @dDateFrom VARCHAR(10), 
    @dDateTo VARCHAR(10), 
    @cCompID VARCHAR(10), 
    @cFilter VARCHAR(30) 
as 

declare @cSQL VARCHAR(200), 
     @cSQL1 VARCHAR(200), 
     @cmd VARCHAR(8000), 
     @cmd1 VARCHAR(8000), 
     @cTempTable varchar (50), 
     @cTempTable1 varchar (50), 
     @nInterval VARCHAR(3), 
     @nCurrent INTEGER, 
     @nInterval1 varchar(3), 
     @nInterval2 varchar(3), 
     @nInterval3 varchar(3), 
     @nInterval4 varchar(3), 
     @nInterval5 varchar(3), 
     @dd INTEGER, 
     @cValue1 VARCHAR(100), 
     @cValue2 VARCHAR(100), 
     @cValue3 VARCHAR(100), 
     @cValue4 VARCHAR(100), 
     @cValue5 VARCHAR(100) 

set @nInterval = 30 
set @nInterval1 = cast(@nInterval * 1 as varchar(3)) 
set @nInterval2 = cast(@nInterval * 2 as varchar(3)) 
set @nInterval3 = cast(@nInterval * 3 as varchar(3)) 
set @nInterval4 = cast(@nInterval * 4 as varchar(3)) 
set @nInterval5 = cast(@nInterval * 5 as varchar(3)) 

SET @cValue1 = CONVERT(VARCHAR(10),1,110) + ' - ' + CONVERT(VARCHAR(10),@nInterval1,110) + ' Days' 
SET @cValue2 = CONVERT(VARCHAR(10),@nInterval1 + 1,110) + ' - ' + CONVERT(VARCHAR(10),@nInterval2,110) + ' Days' 
SET @cValue3 = CONVERT(VARCHAR(10),@nInterval2 + 1,110) + ' - ' + CONVERT(VARCHAR(10),@nInterval3,110) + ' Days' 
SET @cValue4 = CONVERT(VARCHAR(10),@nInterval3 + 1,110) + ' - ' + CONVERT(VARCHAR(10),@nInterval4,110) + ' Days' 
SET @cValue5 = 'Above ' + CONVERT(VARCHAR(10),@nInterval4,110) + ' Days' 

create table ##Interval 
(
    cCompID varchar(20), 
    nOrder int, 
    cInterval varchar(20), 
    cCode varchar(20) 
) 


--------------------------- 
--get all the clients 
--------------------------- 
SELECT * INTO ##temp1 FROM 
(
    select cCode from client_customer where cCode = @cFrom union all 
    select cGroupCode from client_customer where cCode = @cFrom union all 
    select cBillingCompany from client_customer where cCode = @cFrom union all 
    select cArea from client_customer where cCode = @cFrom 
)a 

--------------------------- 
--determining the balance of the invoices 
--------------------------- 
SELECT * INTO ##temp2 FROM 
(
    (
     select a.cCompanyID, a.cInvNo, sum(a.nGross) as nSales, 0 as nPaid, 0 as nDebit, 0 as nCredit, 0 as nReturns 
     from sales a 
     where a.lCancelled = 0 and a.cPayType<>'Cash' 
      and a.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 
     group by a.cCompanyID, a.cInvNo 
    ) 
    union all 
    (
     select a.cCompanyID, a.cInvNo, 0 as nSales, sum(a.nApplied) as nPaid, 0 as nDebit, 0 as nCredit, 0 as nReturns 
     from pr_t a 
     left outer join pr b on a.cTranNo = b.cTranNo and a.cCompanyID = b.cCompanyID 
     left outer join sales c on a.cInvNo = c.cInvNo and a.cCompanyID = c.cCompanyID 
     where b.lCancelled = 0 
      and c.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 
     group by a.cCompanyID, a.cInvNo 
    ) 
    union all 
    (
     select a.cCompanyID, a.cInvNo, 0 as nSales, 0 as nPaid, sum(a.nDebit) as nDebit, 0 as nCredit, 0 as nReturns 
     from ar_t a 
     left outer join ar b on a.cTranNo = b.cTranNo and a.cCompanyID = b.cCompanyID 
     where b.cType = 'Debit' and b.lCancelled = 0 and b.lApproved = 1 
      and b.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 
     group by a.cCompanyID, a.cInvNo 
    ) 
    union all 
    (
     select a.cCompanyID, a.cInvNo, 0 as nSales, 0 as nPaid, 0 as nDebit, sum(a.nCredit) as nCredit, 0 as nReturns 
     from ar_t a 
     left outer join ar b on a.cTranNo = b.cTranNo and a.cCompanyID = b.cCompanyID 
     where b.cType = 'Credit' and b.lSalesReturn = 0 and b.lCancelled = 0 and b.lApproved = 1 
      and b.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 
     group by a.cCompanyID, a.cInvNo 
    ) 
    union all 
    (
     select a.cCompanyID, a.cInvNo, 
     0 as nSales, 0 as nPaid, 0 as nDebit, 0 as nCredit, sum(a.nCredit) as nReturns 
     from ar_t a 
     left outer join ar b on a.cTranNo = b.cTranNo and a.cCompanyID = b.cCompanyID 
     where b.cType = 'Credit' and b.lSalesReturn = 1 and b.lCancelled = 0 and b.lApproved = 1 
      and b.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 
     group by a.cCompanyID, a.cInvNo 
    ) 
)a 


----------------------- 
--main script for creating the temp ##AR 
----------------------- 
select a.*, b.cRefNo, b.dRefDate, b.nBeg, b.nEnd, b.nConsumed, b.nConsumedKG, b.nPrice, b.nAmount, b.nVat, b.nWHT, b.nNet, 
      case when a.nDue <=0 then 'Current' 
       when a.nDue > 0 and a.nDue <= @nInterval1 then @cValue1 
       when a.nDue > @nInterval1 and a.nDue <= @nInterval2 then @cValue2 
       when a.nDue > @nInterval2 and a.nDue <= @nInterval3 then @cValue3 
       when a.nDue > @nInterval3 and a.nDue <= @nInterval4 then @cValue4 
       when a.nDue > @nInterval4 then @cValue5 
      end as cInterval,b.cTenantName into ##AR 
    from 
    (
     select a.cCompanyID, b.cCode, a.cInvNo, (isnull(sum(a.nSales), 0) - isnull(sum(a.nPaid), 0) + isnull(sum(a.nDebit), 0) - isnull(sum(a.nCredit), 0) - isnull(sum(a.nReturns), 0)) as nBalance, 
       b.dDate, b.cSMan, b.nGross, b.cTerm, c.cValue, (cast((cast(convert(varchar(20),getdate(),101) as datetime) - b.dDate) as integer) - cast(c.cValue as integer)) as nDue, dateadd(d,cast(c.cValue as integer),b.dDate) as dDueDate 
     from 
     (
      select * FROM ##temp2 --determining the balance of the invoices 
     ) a 
     left outer join sales b on a.cInvNo = b.cInvNo and a.cCompanyID = b.cCompanyID 
     left outer join parameter_user c on b.cTerm = c.cParamName and c.cType = 'TERMS' 
     where b.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 
     group by a.cCompanyID, b.cCode, a.cInvNo, b.dDate, b.cSMan, b.nGross, b.cTerm, c.cValue 
     having (isnull(sum(a.nSales), 0) - isnull(sum(a.nPaid), 0) + isnull(sum(a.nDebit), 0) - isnull(sum(a.nCredit), 0) - isnull(sum(a.nReturns), 0)) > 0 
    )a 
    left outer join 
    (
     select a.cCompanyID, a.cInvNo, b.cRefNo, d.dDate as dRefDate, 
      case when a.cType = 'Meter' then b.nMeterIn 
       when a.cType = 'Weight' then b.nWeightOut 
      else 0 end as nBeg, 
      case when a.cType = 'Meter' then b.nMeterOut 
       when a.cType = 'Weight' then b.nWeightIn 
      else 0 end as nEnd, b.nConsumed, 
      case when a.cType = 'Meter' then b.nConsumedKG 
       when a.cType = 'Weight' then (b.nWeightOut - b.nWeightIn) 
      else 0 end as nConsumedKG, b.nPrice, (b.nAmount/1.12) as nAmount, 
       (b.nAmount - (b.nAmount/1.12)) as nVat, 
       (CASE WHEN e.lEWT=1 THEN ((b.nAmount/1.12) * e.nEWT/100) ELSE 0 END) as nWHT, b.nAmount as nNet,f.cTenantName 


     from sales a left outer join sales_t b on a.cInvNo = b.cInvNo and a.cCompanyID = b.cCompanyID 
      left outer join item c on b.cItemNo = c.cItemNo and a.cCompanyID = c.cCompanyID 
      left outer join dr d on d.cDRNo = b.cRefNo 
      left outer JOIN CLIENT_CUSTOMER e ON a.cCode = e.cCode 
      left outer JOIN METER_READING_T f ON b.cMRNo = f.cTransNo AND b.nMeterIn = f.nMeterIn 
     where c.cType <> 'CYLINDER' and a.cType <> 'Invoice' and a.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 

     union all 

     select a.cCompanyID, a.cInvNo, d.cDRNo as cRefNo, d.dDate as dRefDate, 0 as nBeg, 
      0 as nEnd, b.nConsumed, 0 as nConsumedKG, b.nPrice, b.nAmount, 0 as nVat, 0 as nWHT, 0 as nNet,'' as cTenantName 
     from sales a left outer join sales_t b on a.cInvNo = b.cInvNo and a.cCompanyID = b.cCompanyID 
      left outer join item c on b.cItemNo = c.cItemNo and a.cCompanyID = c.cCompanyID 
      left outer join dr d on a.cInvNo = d.cInvNo   
     where c.cType <> 'CYLINDER' and a.cType = 'Invoice' and d.cDRNo is null and a.cCode in (select * FROM ##temp1) --get all the clients 
      and a.cCompanyID = @cCompID 
    )b on a.cInvNo = b.cInvNo and a.cCompanyID = b.cCompanyID 


----------------------- 
--main script for creating the temp ##Interval 
----------------------- 
insert into ##Interval 
select distinct @cCompID, 1, 'Above 120 Days', cCode from ##AR 
insert into ##Interval 
select distinct @cCompID, 2, '91 - 120 Days', cCode from ##AR 
insert into ##Interval 
select distinct @cCompID, 3, '61 - 90 Days', cCode from ##AR 
insert into ##Interval 
select distinct @cCompID, 4, '31 - 60 Days', cCode from ##AR 
insert into ##Interval 
select distinct @cCompID, 5, '1 - 30 Days', cCode from ##AR 
insert into ##Interval 
select distinct @cCompID, 6, 'Current', cCode from ##AR 




-------------------------------------- 
--displaying the result 
-------------------------------------- 

select a.nOrder, a.cInterval, a.cCode, c.cName, (c.cFirstName + ' ' + case when isnull(c.cMiddleInitial,'')='' then '' else c.cMiddleInitial + ' ' end + c.cLastName) as cCustomerName, (case when isnull(c.cBusinessName,'')='' then c.cName else c.cBusinessName end) as cBusinessName, 
     c.cAddress, c.cLastName, c.cJobTitle, d.cCompanyName, d.cAddress1, d.cAddress2, d.cPhone, d.cfax, d.cEmail, c.cTerm, b.cInvNo, b.nBalance, b.dDate, b.nGross, b.cRefNo, b.dRefDate, b.nBeg, b.nEnd, b.nConsumed, b.nCOnsumedKG, 
     b.nPrice, b.nAmount, b.nVat, b.nWHT, b.nNet, isnull(e.nTotalPDC,0) as nTotalPDC, f.nTotalAR, f.nTotalPastDue, c.nLimit, @dDateFrom as dStartDate, @dDateTo as dEndDate,--g.cTenantName, 
     b.cTenantName,(CASE WHEN @cFilter = 'Show Note' THEN 1 ELSE 0 END) AS lNote 
from ##Interval a 
left outer join ##AR b on a.cInterval = b.cInterval and a.cCode = b.cCode 
left outer join client_customer c on a.cCode = c.cCode 
left outer join company d on a.cCompID = d.cCompanyID 
left outer join 
(
    select a.cCode, sum(a.nAmount) as nTotalPDC 
    from checks a 
    where a.lDeposited=0 and a.cTransType = 'COL' and a.cCode = @cFrom and a.cCompanyID = @cCompID 
    group by a.cCode 
)e on a.cCode=e.cCode 
left outer join 
(
    --select a.cCode, sum(a.nBalance) as nTotalAR, sum(case when a.cInterval <> 'Current' then isnull(a.nBalance,0) else 0 end) as nTotalPastDue 
    --from ##AR a 
    --group by a.cCode 

    SELECT a.cCode,SUM(nTotalAR) AS nTotalAR,SUM(nTotalPastDue) AS nTotalPastDue 
    FROM 
     (select distinct a.cCode, (a.nBalance) as nTotalAR, 
      (case when a.cInterval <> 'Current' then isnull(a.nBalance,0) else 0 end) as nTotalPastDue 
     from ##AR a) a 
    GROUP BY a.cCode 

)f on a.cCode=f.cCode 
order by a.nOrder, a.cCode 


drop table ##temp1 
drop table ##temp2 
drop table ##Interval 
drop table ##AR 


/* 
    select * from ##temp1 
    select * from ##temp2 
    select * from ##Interval 
    select * from ##AR 
*/ 

сервер SQL всегда указывает на ошибку в этой строке

-------------------------------------- 
--displaying the result 
-------------------------------------- 

select a.nOrder, a.cInterval, a.cCode, c.cName, (c.cFirstName + ' ' + case when isnull(c.cMiddleInitial,'')='' then '' else c.cMiddleInitial + ' ' end + c.cLastName) as cCustomerName, (case when isnull(c.cBusinessName,'')='' then c.cName else c.cBusinessName end) as cBusinessName, 
     c.cAddress, c.cLastName, c.cJobTitle, d.cCompanyName, d.cAddress1, d.cAddress2, d.cPhone, d.cfax, d.cEmail, c.cTerm, b.cInvNo, b.nBalance, b.dDate, b.nGross, b.cRefNo, b.dRefDate, b.nBeg, b.nEnd, b.nConsumed, b.nCOnsumedKG, 
     b.nPrice, b.nAmount, b.nVat, b.nWHT, b.nNet, isnull(e.nTotalPDC,0) as nTotalPDC, f.nTotalAR, f.nTotalPastDue, c.nLimit, @dDateFrom as dStartDate, @dDateTo as dEndDate,--g.cTenantName, 
     b.cTenantName,(CASE WHEN @cFilter = 'Show Note' THEN 1 ELSE 0 END) AS lNote 
+1

Как выглядит ваш сценарий? – LittleBobbyTables

+0

Так какой из утверждений на самом деле ошибки? И в какой колонке в ваших таблицах есть чувствительная к акценту сортировка, и у которой есть одна нечувствительность? какова стандартная сортировка вашей базы данных и какой у вас сервер? –

ответ

4

Это, вероятно, либо:

  1. Там некоторые конкретные столбцы или таблицы с символами, созданные с другим COLLATION, тогда вы делаете compa rison на столбцах различной сортировки.

  2. Вы используете сценарий против базы данных, которая отличается от вашего сервера, и использует сценарии TEMP TABLE. Таблицы Temp создаются в базе данных tempdb, поэтому они получают COLLATION tempdb (то есть сортировку сервера). Большинство сценариев этого не ожидают, поэтому сравнения с столбцами таблицы temp не указывают сортировку.

Вы можете исправить это либо путем изменения таблиц/столбцов, поэтому матч сортировки, либо изменить SQL таким образом, чтобы указать, какие параметры сортировки для использования в каждом сравнении строк.

например. изменить:

select * 
from someTable 
inner join #t on someTable.col1 = #t.col1 
where #t.col2 = 'blah' collate database default 

к этому:

select * 
from someTable 
inner join #t on someTable.col1 = #t.col1 collate database default 
where #t.col2 = 'blah' collate database default 

UPDATE:

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

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

  • Для определения конкретного запроса, что это проблема, которую я хотел бы предложить вам вырваться из подзапросов и есть скрипт выполнить их по отдельности. Просто для отладки.

  • Попробуйте позвонить sp_help '##temp1' и для других таблиц после их создания и сравнить сопоставления столбцов с таковыми в ваших основных таблицах.

  • Добавить collate database default в конце каждого из сравнений (где это необходимо, если вы используете sp_help предложение)

  • Создание таблиц временных явно вместо с помощью SELECT INTO. Таким образом вы можете указать сортировку столбцов. Вместо этого используйте табличные переменные.

+0

см. Мой сценарий. спасибо – illumi

+0

@ dave, он дал вам ответ. Из вашего сценария никто не может сказать вам, где вам нужен оператор COLLATE. Конфликт сопоставлений происходит где-то, где столбец одной таблицы задан в другой сортировке, чем другой, или отличается от значения по умолчанию сервера или базы данных. – ErikE

6

Если сравнить/агрегатные столбцы с различными параметрами сортировки необходимо СЛАЖЕННОСТЬ по крайней мере один из них к обобщению вы хотите, используя выражение COLLATE.Например, у вас есть столбец c1 при сличении Latin1_General_CI_AI в таблице Table1 и столбцом c2 с комплектовкой SQL_Latin1_General_CP1_CI_AS в таблице Table2 и вы хотите союз два:

SELECT c1 COLLATE SQL_Latin1_General_CP1_CI_AS 
FROM Table1 
UNION ALL 
SELECT c2 
FROM Table2; 
2

Похоже, этот вопрос старого вопроса, но я В любом случае, я отвечу на все вопросы, потому что у меня довольно недавно была аналогичная проблема, и я подумал, что это может спасти кому-то еще какое-то горе!

Проверьте, что таблица создает скрипты для базы данных, поскольку они могут устанавливать сортировки по столбцам при создании времени. Который вы можете не обязательно вызывать ошибку до конца цикла разработки. то есть, как, например, вы определить здесь в том, что вы пытаетесь преформ сравнении в РАВЕНСТВО

select a.nOrder, a.cInterval, a.cCode, c.cName, (c.cFirstName + ' ' + case when isnull(c.cMiddleInitial,'')='' then '' else c.cMiddleInitial + ' ' end + c.cLastName) as cCustomerName, (case when **isnull(c.cBusinessName,'')=''** then c.cName else c.cBusinessName end) as cBusinessName,   c.cAddress, c.cLastName, c.cJobTitle, d.cCompanyName, d.cAddress1, d.cAddress2, d.cPhone, d.cfax, d.cEmail, c.cTerm, b.cInvNo, b.nBalance, b.dDate, b.nGross, b.cRefNo, b.dRefDate, b.nBeg, b.nEnd, b.nConsumed, b.nCOnsumedKG,   b.nPrice, b.nAmount, b.nVat, b.nWHT, b.nNet, isnull(e.nTotalPDC,0) as nTotalPDC, f.nTotalAR, f.nTotalPastDue, c.nLimit, @dDateFrom as dStartDate, @dDateTo as dEndDate,--g.cTenantName,   b.cTenantName,(CASE WHEN @cFilter = 'Show Note' THEN 1 ELSE 0 END) AS lNot 

Я выделил его жирным шрифтом. Моя проблема, похоже, связана с тем фактом, что некоторые из наших таблиц были созданы в студии управления SQL, а в Visual Studio были созданы некоторые таблицы, в которых были установлены разные настройки сортировки. Это заняло довольно много времени, чтобы понять это. Это было только после просмотра сценариев базы данных, которые я выбрал. Теперь мы перешли к использованию выпуска для разработчиков баз данных в премиум-классе на Visual Studio, который теперь упростил управление конфигурацией базы данных и модульное тестирование

Смежные вопросы