SELECT pk FROM dbo.basetable
WHERE
CASE
WHEN collation = 1 THEN name COLLATE Albanian_BIN
WHEN collation = 2 THEN name COLLATE Chinese_Taiwan_Bopomofo_90_BIN2
WHEN collation = 3 THEN name COLLATE Norwegian_100_CS_AS_WS
...
END = @parameter;
use tempdb;
go
create table ct1 ( id int identity(1,10) primary key not null, name nvarchar(4000) collate Albanian_CI_AS);
create table ct2 ( id int identity(1,10) primary key not null, name nvarchar(4000) collate French_CI_AS);
create table ct3 ( id int identity(1,10) primary key not null, name nvarchar(4000) collate Estonian_CI_AS);
create table ct4 ( id int identity(1,10) primary key not null, name nvarchar(4000) collate SQL_Latin1_General_CP1_CI_AS);
go
create view ctview
as
select id,cast( name as sql_variant ) name
from ct1
union all
select id,cast( name as sql_variant ) name
from ct2
union all
select id,cast( name as sql_variant ) name
from ct3
union all
select id,cast( name as sql_variant ) name
from ct4;
go
insert ct1(name) values('Albanian');
insert ct2(name) values('French');
insert ct3(name) values('Estonian');
insert ct4(name) values('sql');
go
select id, name, sql_variant_property(name, 'collation') as collation
from ctview;
go
drop view ctview;
drop table ct1;
drop table ct2;
drop table ct3;
drop table ct4;
不,您不能告诉 SQL Server 以不同方式整理不同的行。排序规则适用于列、数据库或实例。
在查询中,您可以应用不同的归类规则,例如使用
CASE
表达式进行比较。假设您可以添加一列来指示该行应该使用什么排序规则。但这将不允许您在同一列中以不同的排序规则存储数据。如果这是实际需要而不仅仅是一些赌注,您可以考虑某种 EAV 设计,例如:
确实,您的问题的答案肯定是否定的,但您可以实现一种软糖。