SQL Server:尽管进行了转换,但无法解决排序规则冲突
Posted
技术标签:
【中文标题】SQL Server:尽管进行了转换,但无法解决排序规则冲突【英文标题】:SQL Server: Cannot resolve the collation conflict, despite conversion 【发布时间】:2017-03-22 13:51:53 【问题描述】:我仍然得到错误代码
无法解决“Latin1_General_CI_AS”之间的排序规则冲突 和“SQL_Latin1_General_CP1_CI_AS”中的等于操作。
尽管我使用的是根据these 两个answers 的转换。这是我的代码:
-- ...
from #TmpResult a
left join #GroupMemberTable b
on (a.DBO_Owner_Login COLLATE SQL_Latin1_General_CP1_CI_AS) = (b.login_name COLLATE SQL_Latin1_General_CP1_CI_AS)
我已将它们都转换为:SQL_Latin1_General_CP1_CI_AS
谢谢
更新: 以下是全文摘录:
create table #TmpTableSec3 (database_name varchar(100), Database_Owner varchar(200), DBO_Owner_Login varchar(200), type varchar (100), privilege varchar(100), group_name varchar(500))
insert into #TmpTableSec3
select a.database_name, a.principal, a.DBO_Owner_Login, b.type, b.privilege, b.group_name
from #TmpResult a
left join #GroupMemberTable b
on (a.DBO_Owner_Login COLLATE SQL_Latin1_General_CP1_CI_AS) = (b.login_name COLLATE SQL_Latin1_General_CP1_CI_AS)
--a.DBO_Owner_Login = b.login_name
--fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT
where b.group_name is not null --and b.privilege = 'admin'
order by a.database_name
然后该表由以下内容填充:
insert into #TmpResult
select a.database_name, a.Owner, b.DBO_Owner_Login from #TmpTableSec1 a
join #TmpTableSec2 b
on a.database_name = b.database_name
set @cmd = 'select name, suser_sname(owner_sid) from master.sys.databases where name = '''+@name+''''
--select @cmd
insert #TmpTableSec1 exec (@cmd)
--select @dbowner = (select suser_sname(owner_sid) from master.sys.databases where name = @name)
set @cmd = 'use '+ @name +'
select db_name(), name, suser_sname(sid)
from sys.database_principals where name = ''dbo'''
--select ''@DBO'' = (select suser_sname(sid) from sys.database_principals where name = ''dbo'') '
INSERT #TmpTableSec2 exec (@cmd)
【问题讨论】:
问题可能出在代码的.....
部分
请发布您尝试执行的整个代码
@NickyvV 我发了更多,但我认为问题只与那一行有关
您正在向表中插入数据,错误很可能是某些列的排序规则定义与您插入的不同。如果问题出在a.DBO_Owner_Login
,您可能还想在SELECT
中使用a.DBO_Owner_Login COLLATE SQL_Latin1_General_CP1_CI_AS
(或适当的排序规则)
偶然是原始表格中存储为文本的字段之一?
【参考方案1】:
drop table #test
drop table #test2
create table #test
(id int, name varchar(100) collate Latin1_General_CI_AI
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED ([id] ASC)
)
create table #test2
(id int, name varchar(100) collate SQL_Latin1_General_CP1_CI_AS
CONSTRAINT [PK_test2] PRIMARY KEY CLUSTERED ([id] ASC)
)
insert into #test values (1, 'premonition')
insert into #test values (2, 'premònition')
insert into #test values (3, 'lowmotion')
insert into #test2 values (1, 'premonition')
insert into #test2 values (2, 'premònition')
insert into #test2 values (3, 'lowmotion')
select *
from #test
inner join #test2
on #test.name = #test2.name collate SQL_Latin1_General_CP1_CI_AS
collate SQL_Latin1_General_CP1_CI_AS
强制与此排序规则进行比较,我使用的是 #test2.name 中定义的相同排序规则
也许这篇“排序优先”文章可以帮助您。
https://msdn.microsoft.com/en-us/library/ms179886.aspx
【讨论】:
以上是关于SQL Server:尽管进行了转换,但无法解决排序规则冲突的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL Server 代码转换为 MS Access SQL 代码 - DISTINCT 问题 [重复]
在sql server中使用分隔符将没有分隔符的日期和时间转换为日期时间
sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
无法从 NET Core 2.2 Web API 连接到 docker sql server
sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
成功安装SQL Server实例后 无法找到SQL Server Configuration Manager工具的解决方案