简体   繁体   English

SQL Server排序规则冲突-创建视图

[英]SQL Server Collation conflict - creating a view

i am trying to create a View in a Database A, that is filled by a select from the Database B and i am having a collation conflict, to be more exactly , its between ( Latin1_General_CI_AS" and "Latin1_General_BIN ). 我试图在数据库A中创建一个视图,该视图由数据库B中的选择填充,并且我存在排序规则冲突,更确切地说,是它在(Latin1_General_CI_AS“和” Latin1_General_BIN)之间。 WHere(in the code) i need to put the collate? 在这里(在代码中)我需要整理一下?

Best Regards. 最好的祝福。

The code is here: 代码在这里:

CREATE VIEW [dbo].[CML_SDG_MENSAL_ESTOQUE]
AS

select  
SUM(dw_fato_faturmes.val_fatur) val_fatur, 
SUM(dw_fato_faturmes.val_receita) val_receita, 
SUM(dw_fato_faturmes.qtd_bonif_item) qtd_bonif_item, 
SUM(dw_fato_faturmes.val_bonif_fatur) val_bonif_fatur,
SUM(dw_fato_faturmes.val_bonif_receita) val_bonif_receita,
SUM(dw_fato_faturmes.val_devol_fatur) val_devol_fatur,
SUM(dw_fato_faturmes.val_devol_receita) val_devol_receita,
DW_DIM_PRODUTO.B1_CODDB B1_CODDB,
dw_fato_faturmes.cod_produto cod_produto, 
SUM(dw_fato_faturmes.qtd_estoque) qtd_estoque, 
SUM(dw_fato_faturmes.qtd_devol) qtd_devol, 
SUM(dw_fato_faturmes.qtd_item) qtd_item, 
SUM(dw_fato_faturmes.qtd_meta) qtd_meta,
SUM(dw_fato_faturmes.qtd_pedido) qtd_pedido,
SUM(dw_fato_faturmes.qtd_item)+
    SUM(dw_fato_faturmes.qtd_bonif_item)+
    SUM(dw_fato_faturmes.qtd_devol) venda_liquida
(SUM(dw_fato_faturmes.qtd_item)
     +SUM(dw_fato_faturmes.qtd_bonif_item)
    +SUM(dw_fato_faturmes.qtd_devol))
    +SUM(dw_fato_faturmes.qtd_pedido) venda___pedido
FROM 
logixbi.dbo.dw_fato_faturmes dw_fato_faturmes, 
logixbi.dbo.DW_DIM_CLIENTE DW_DIM_CLIENTE, 
DW_DIM_EMPRESA DW_DIM_EMPRESA, 
logixbi.dbo.DW_DIM_MARCA DW_DIM_MARCA, 
logixbi.dbo.DW_DIM_PRODUTO DW_DIM_PRODUTO, 
logixbi.dbo.DW_DIM_REPRESENTANTE DW_DIM_REPRESENTANTE

where 
DW_DIM_EMPRESA.SM0_FILIAL=dw_fato_faturmes.filial and
DW_DIM_MARCA.BM_GRUPO=dw_fato_faturmes.grupo and
DW_DIM_PRODUTO.B1_COD=dw_fato_faturmes.cod_produto and
DW_DIM_REPRESENTANTE.A3_COD=dw_fato_faturmes.vendedor and
DW_DIM_CLIENTE.A1_COD=dw_fato_faturmes.cliente and
DW_DIM_CLIENTE.A1_LOJA=dw_fato_faturmes.loja

group by DW_DIM_PRODUTO.B1_CODDB,dw_fato_faturmes.cod_produto

In order to find wich column has wich collation use this snippet: 为了找到具有列排序规则的列,请使用以下代码段:

SELECT name, collation_name
  FROM sys.columns
  WHERE OBJECT_ID IN (SELECT OBJECT_ID
                        FROM sys.objects
                       WHERE type = 'U'
                         AND name = 'your_table_name'
                      )
    AND name = 'your_column_name'

Once you find the columns try this: 找到列后,请尝试以下操作:

column_1 COLLATE your_collation = column_2 COLLATE your_collation

It is better to stick to a single collation globally. 最好在全球范围内坚持单一排序规则。 Otherwise you will have problems. 否则,您将遇到问题。 Here is a snippet that will give you all the columns on your database with a COLLATION different than the one in the database 这是一个片段,它将为您提供数据库中所有列的COLLATION与数据库中的列不同

SELECT [TABLE_NAME] = OBJECT_NAME([id]),
       [COLUMN_NAME] = [name],
       [COLLATION_NAME] = collation
  FROM syscolumns
 WHERE collation <> 'your_database_collation_type'
   AND collation IS NOT NULL
   AND OBJECTPROPERTY([id], N'IsUserTable')=1

Where to put it depends on where the conflict is. 放在哪里取决于冲突的位置。

I'd suggest on the joins 我建议加入

ie

DW_DIM_EMPRESA.SM0_FILIAL COLLATE Latin1_General_CI_AS =dw_fato_faturmes.filial COLLATE Latin1_General_CI_AS 

这是由于不同归类类型之间的操作而发生的,因此请尝试使用此语句进行比较。

ColumnA = ColumnB collate database_default

尝试在where子句中的所有字符匹配条件中使用此命令:

colnameA COLLATE Latin1_General_CI_AS = columnnameB COLLATE Latin1_General_CI_AS

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM