将ASCII(子)集转移到表

时间:2017-12-10 13:24:38

标签: sql sql-server database relational-database ascii

我正在尝试将ASCII字符的子集传输到表中,但我一直收到错误,说我在SSMS中复制了值。

这是我的表格代码:

create table xyz(
  aChar char not null,
  primary key(aChar)
);

这将填充表格:

declare @xChars int = 250
declare @iterations int = 0
while @iterations < @xChars
begin
insert into xyz values (char(@iterations))
set @iterations += 1
end

希望你们中的一个可以帮助我。

2 个答案:

答案 0 :(得分:2)

问题是不区分大小写的排序规则。 Class B'a'是一回事。因此,使用区分大小写的排序规则:

'A'

您可以使用一个语句执行此操作:

create table xyz (
  aChar char collate SQL_Latin1_General_CP1_CS_AS not null,
  primary key(aChar)
);

Here是一个SQL小提琴。

您也可以使用计算列执行此操作:

with nums as (
      select 1 as n
      union all
      select n + 1
      from nums
      where n + 1 < 250
     )
insert into xyz (aChar)
    select char(nums.n)
    from nums
options (maxrecursion 0);

this SQL Fiddle。

所示

答案 1 :(得分:1)

SQL Server中的字符数据与排序规则一起存储。排序规则定义文本的排序顺序和相等比较。默认排序规则不区分大小写,因此字符“a”和字符“A”比较相等。 aChar上有唯一索引,因此您无法在列中存储“a”和“A”。也可能通过空格或不可打印的字符进行比较。

您希望使用二进制排序规则声明该列,以便字符按代码点进行比较,而不是通过语言排序规则进行比较。例如

drop table if exists xyz
create table xyz(
  aChar char  collate Latin1_General_BIN2 not null,
  primary key(aChar)
);
go
declare @xChars int = 250
declare @iterations int = 0
while @iterations < @xChars
begin
insert into xyz values (char(@iterations))
set @iterations += 1
end