Я получил это сообщение при выполнении сценария Python 2.7: u'42000 ', u' [42000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Не удалось разрешить конфликт параметров сортировки между «Latin1_General_CI_AI» и «SQL_Latin1_General_CP1_CI_AS»в операции charindex. '
Я исследовал подобные проблемы здесь и нашел некоторые из них в чисто SQL-теме.Я попытался использовать COLLATE, но заметил, что запрос выполняется в MSSql Management Studio, поэтому проблема, похоже, связана с pypyodbc.
Я попробовал 3 доступных драйвера («SQL Server», «Собственный клиент SQL Server»).11.0 'и' Драйвер ODBC 11 для SQL Server ') в моем соединении pypyodbc, но возникает та же ошибка.
Это проблема из pypyodbc-1.3.5.2?Есть решение, отличное от установки pyodbc (это установка на python через ArcGIS, поэтому даже pip не доступен в каталоге python27)?
Вот запрос:
consulta_aia =u"""
SELECT
PRO.idProcesso as NIS
,CAT.nomCategoria
,PRO.Sigla
,PRO.codano as AnoProcesso
,PRO.codnumero as NumeroProcesso
,SIT.nomSituacao as nomSituacao
,FAS.nomFase
,STA.nomStatus
,PST.datInicio as datInicio
,case
when INF.desInfracao like '%(FL)%' then 'FL'
when INF.desInfracao like '%(FA)%' then 'FA'
when INF.desInfracao like '%(MI)%' then 'MI'
when INF.desInfracao like '%(PE)%' then 'PE'
when INF.desInfracao like '%(UC)%' then 'UC'
when INF.desInfracao like '%(CO)%' then 'CO'
when INF.desInfracao like '%(ORN)%' then 'ORN'
when INF.desInfracao like '%(QU)%' then 'QU'
when INF.desInfracao like '%(APP)%' then 'APP'
when INF.desInfracao like '%(APM)%' then 'APM'
when INF.desInfracao like '%(APP' then 'APP'
when INF.desInfracao like '%(FG)%' then 'FG'
when INF.desInfracao like '%(PO)%' then 'PO'
when INF.desInfracao like '%FAUNA%' OR desinfr LIKE '%FAUNA%' then 'FA'
when INF.desInfracao like '%TRATOS DOMÉSTICOS%' then 'FA'
when INF.desInfracao like '%TRATOS SILVESTRES%' then 'FA'
when INF.desInfracao like '%MOTOSSERRA%' then 'FL'
when INF.desInfracao like '%MOTOSERRA%' then 'FL'
when INF.desInfracao like '%PESCA%' OR desinfr LIKE '%PESCA%' then 'PE'
when INF.desInfracao like '%VEGETAÇÃO NATURAL EM LOCA%' then 'FL'
when INF.desInfracao like '%RESERVA LEGAL%' then 'FL'
when INF.desInfracao like '%VEGETAÇÃO NATIVA%' then 'FL'
when INF.desInfracao like '%VEGETAÇÃO DE ESPÉCIES%' then 'FL'
when INF.desInfracao like '%ORIGEM VEGETAL%' then 'FL'
when INF.desInfracao like '%DESTRUIR FLORESTAS%' then 'FL'
when INF.desInfracao like '%MADEIRA%' then 'FL'
when INF.desInfracao like '%PRESERVAÇÃO PERMANENTE%' then 'APP'
when INF.desInfracao like '%FOGO%' OR desinfr LIKE '%FOGO%' then 'FG'
when INF.desInfracao like '%VEGETAÇÃO NATIVA%' OR desinfr LIKE '%ARVORES NATIVAS%' then 'FL'
when INF.desInfracao like '%EMBARGO%' then 'EMB'
when INF.desInfracao like '%MINER%' OR desinfr LIKE '%MINER%' then 'MI'
when INF.desInfracao like '%UNIDADE DE CONSERV%' then 'UC'
else 'OUT'
end as CatInfra
,INF.desInfracao as NomeInfracao
,PMAUTO.[desinfr] as DescricaoInfracao
,upper(PES.nomPessoa) as NomeAutuado
,convert(varchar(19), AIA.datInfracao,20) as DataInfracao
,PMAUTO.[bopfm] as NumeroBO
,case when len(MUN.codIBGE)>6 then MUN.codIBGE else '3550308' end as CodIBGE
,MUN.nomMunicipio as PRO_Municipio
,case
when PMAUTO.[area] > 0 then PMAUTO.[area]
when MFOA.[AreaDegradada] > 0 then MFOA.[AreaDegradada]
else MFOA.[AreaTotal]
end as AreaAfetada
,case
when aiaalt.LocalInfracao is not null then SUBSTRING(aiaalt.LocalInfracao.STAsText(), charindex(' -2', aiaalt.LocalInfracao.STAsText()), 19)
when len(PMAUTO.[gpsy]) > 1 then PMAUTO.[gpsy]
else convert(varchar(20), CEA.latitude, 3)
end as Latitude
,case
when aiaalt.LocalInfracao is not null and aiaalt.LocalInfracao.STAsText() like 'POINT%' then SUBSTRING(aiaalt.LocalInfracao.STAsText(), 8, 16)
when aiaalt.LocalInfracao is not null and aiaalt.LocalInfracao.STAsText() like 'POLYGON%' then SUBSTRING(aiaalt.LocalInfracao.STAsText(), 11, 16)
when aiaalt.LocalInfracao is not null and aiaalt.LocalInfracao.STAsText() like 'MULTIPOLYGON%' then SUBSTRING(aiaalt.LocalInfracao.STAsText(), 17, 16)
when len(PMAUTO.[gpsx]) > 1 then PMAUTO.[gpsx]
else convert(varchar(20), CEA.longitude, 3)
end as Longitude
,convert( varchar(30), PST.datAtualiza, 121) as datAtualiza
from sigam.dbo.PROCESSO PRO
inner join sigam.dbo.PRODETALHE PRD on PRD.idProcesso = PRO.idProcesso
left join sigam.dbo.CATEGORIA CAT on CAT.idCategoria = PRD.idCategoria
left join sigam.dbo.PMAUTO on PMAUTO.idProcDet = PRD.idProcDet
left join sigam.dbo.AIA on AIA.idProcDet = PRD.idProcDet
left join sigam.dbo.INFRACAO INF on INF.idInfracao = AIA.idInfracao
left join sigam.dbo.PESSOA PES on PES.idPessoa = PRO.idInteressado
left join sigam.dbo.MUNICIPIO MUN on MUN.idMunicipio = PRO.idMunicipio
left join sigam.dbo.PROCSITU PST on PST.idProcSitua = PRD.idProcSitua
left join sigam.dbo.SITUACAO SIT on SIT.idSituacao = PST.idSituacao
left join sigam.dbo.[STATUS] STA on STA.idStatus = SIT.idStatus
left join sigam.dbo.FASE FAS on FAS.idFase = SIT.idFase
left join [sigam].[dbo].[AIAPM_LOCALOCORRENCIA_ALT] as aiaalt on aiaalt.idProcesso = PRD.idProcesso
left join [SmaFiscalizacaoDb-integracao].dbo.autoinfracaoambiental PMAIA on PMAIA.[IdentificadorAutoInfracao] = AIA.[IdentificadorAutoInfracaoSIOPM]
left join [SmaFiscalizacaoDb-integracao].dbo.ocorrencia OCO on OCO.id = PMAIA.ocorrencia_id
left join [SmaFiscalizacaoDb-integracao].dbo.encerramentoocorrencia ENC on ENC.Ocorrencia_id = OCO.id
left join [SmaFiscalizacaoDb-integracao].[dbo].[AreaIntervencaoOcorrenciaAmbiental] as AIO on AIO.id = PMAIA.AreaIntervencaoOcorrenciaAmbiental_id
left join [SmaFiscalizacaoDb-integracao].[dbo].[MeioFisicoOcorrenciaAmbiental] as MFOA on AIO.Id = MFOA.AreaIntervencaoOcorrenciaAmbiental_id
left join [SmaFiscalizacaoDb-integracao].dbo.ComplementoEncerramentoAmbiental CEA on CEA.EncerramentoOcorrencia_id = ENC.id
WHERE nomCategoria = 'AIA - AUTO DE INFRAÇÃO AMBIENTAL'
AND pro.codano >= '1980' AND pro.codano <= year(getdate())
AND ( lower(STA.nomStatus) NOT LIKE '%sem efeito%' OR lower(STA.nomStatus) IS NULL )
AND PRO.codnumero NOT LIKE '%88888888%'
--AND PST.datAtualiza >= '{0}'
AND aiaalt.LocalInfracao is not null
order by PRO.codano, PRO.codNumero desc
"""
Thisэто соединение:
# string de conexao com o bd de origem
print "{} - Iniciando conexao ao SIGAM".format(time.strftime("%x %X"))
#odbc_sigam = py_odbc_conn2('sigsql01', 'master', 'usrsig', '@@S.1')
odbc_sigam = pypyodbc.connect(u'Driver={SQL Server};Server=sigsql01;Database=master;uid=usrsig;pwd=@@S.1')
print "{} - Conectado ao SIGAM".format(time.strftime("%x %X"))
И, конечно, это фрагмент кода, в котором возникает ошибка:
# seleciona os registros a serem incluidos (todos os registros do select)
print u"\n{0} - Realizando consulta no banco de dados de origem.".format(time.strftime('%x %X'))
registros = odbc_origem.cursor().execute(sql_dados).fetchall()
print u"\n{0} - Consulta realizada. Iniciando processamento do(s) {1} registro(s)".format(time.strftime('%x %X'),str(len(registros)))
Основной сценарий вызывает модуль для выполнения этого запроса, поэтомуслишком обширный, чтобы поставить его здесь целиком.Я не уверен, имеет ли это какое-либо значение, но основной скрипт имеет строку # - - кодирование: latin1 - - и модуль, выполняющий запрос, имеет строку # - - кодирование: utf-8 - -.