小编Sae*_*ati的帖子

为什么这些字符在 SQL Server 中都是相同的?

我只是不明白。请参阅此 SQL 查询:

select nchar(65217) -- ?
select nchar(65218) -- ?
select nchar(65219) -- ?
select nchar(65220) -- ?
if nchar(65217) = nchar(65218)
    print 'equal'
if nchar(65217) = nchar(65219)
    print 'equal'
if nchar(65217) = nchar(65220)
    print 'equal'
Run Code Online (Sandbox Code Playgroud)

基于传递关系,这意味着 SQL Server 认为它们都是同一个字符。

但是,在其他环境中,例如 C#,它们并不相同。

我感到困惑的是:

  1. 字符串比较在 SQL Server 中的工作原理
  2. 为什么比较在一台机器和一个平台上表现不同,但在不同的环境中表现不同
  3. 这 4 个字符代表一个人类可以理解的字符。为什么它们在 Unicode 字符映射中如此丰富?

这当然会导致巨大的问题,因为我正在开发一个文本处理应用程序,数据几乎来自任何地方,我需要在处理之前对文本进行规范化。

如果我知道差异的原因,我可能会找到处理它的解决方案。谢谢你。

sql-server unicode

20
推荐指数
2
解决办法
3422
查看次数

为什么我们不能有多个级联路径?

您可以看到许多关于多级联路径的问题。例如:

/sf/ask/59613781/

/sf/ask/424585101/

/sf/ask/1932918221/

但是,从我所看到和理解的情况来看,您可以在许多情况下删除子记录,而不仅仅是删除相关主记录的一种情况。

虽然在一个问题中说 SQL Server 试图通过防止这种情况发生来确保安全,但我真的不明白如果我们有多个级联路径可能会出现什么问题,以及它可以防止哪些问题使其安全

我希望有人能用通俗易懂的语言向我解释这一点,最好使用多个级联路径可能出现问题的示例。

database-design sql-server cascade

13
推荐指数
1
解决办法
5647
查看次数

如何释放表的未使用空间

这个问题被问了几十次,令我惊讶的是,这样一个简单的要求变得如此困难。然而我无法解决这个问题。

我使用 SQL Server 2014 Express 版,数据库大小限制为 10GB(不是文件组大小,数据库大小)。

我抓取了新闻,并将 HTML 插入到表格中。表的架构是:

Id bigint identity(1, 1) primary key,
Url varchar(250) not null,
OriginalHtml nvarchar(max),
...
Run Code Online (Sandbox Code Playgroud)

数据库容量不足,我收到了 insufficient disk space

当然缩小数据库和文件组没有帮助。DBCC SHRINKDATABASE没有帮助。所以我写了一个简单的应用程序来读取每条记录,去掉一些不需要的部分,OriginalHtml比如 head section 和 aside 和 footer 以只保留主体,现在我在获取顶级表的磁盘使用情况报告时看到这个图像:

在此处输入图片说明

据我了解这张图片,未使用的空间现在占总大小的 50%。也就是说,现在我有 5GB 未使用的空间。但我无法收回它。重建索引没有帮助。该truncateonly选项无济于事,因为据我所知,没有记录被删除,只有每条记录的大小减少。

我被困在这一点上。请帮忙,我该怎么办?

聚集索引在列上Id

这是结果 EXECUTE sys.sp_spaceused @objname = N'dbo.Articles', @updateusage = 'true';

name        rows     reserved     data        index_size   unused
----------- -------- ------------ ----------- ------------ -----------
Articles    112258   8079784 KB   5199840 KB  13360 KB …
Run Code Online (Sandbox Code Playgroud)

sql-server shrink dbcc database-size

8
推荐指数
1
解决办法
1万
查看次数

为什么不同的日期时间会根据索引冻结查询?

我有一张有十亿条记录的表。它有这些列:

Id bigint,
MobileNumber varchar(100),
Date datetime,
Message nvarchar(400)
Run Code Online (Sandbox Code Playgroud)

它在MobileNumberDate字段上具有非聚集索引。

我想找到 aMobileNumber在指定时期内发送给我们的内容。因此我运行这个查询:

select Message
from ReceivedMessages
where [Date] > 'from-time'
and [Date] < 'to-time'
and MobileNumber = 'number-to-filter'
Run Code Online (Sandbox Code Playgroud)

并且此查询在过去 2 年中以闪电般的速度运行。但是当我将from-time零件更改为更近的日期时,它会冻结并需要 2 分钟以上才能完成。换句话说,基于不同的输入,它的行为也不同,有时甚至会闲逛超过 10 分钟不回来。

我期待一致的行为。我想念索引什么?什么会导致这种不一致的性能?

更新:我更改了列和表的名称,因此无法将执行计划附加为图片。但问题就在这里。谢谢你指导我。

当我更改日期参数的值时,SQL 将索引查找从 更改IX_MobileNumberIX_Date。没想到SQL是根据参数的值来创建执行计划的。那怎么可能?

index sql-server

6
推荐指数
1
解决办法
706
查看次数

不允许备份文件或文件组“fileStream”,因为它不在线

我正在尝试备份由我无权访问的人创建的数据库。我收到此错误消息:

不允许备份文件或文件组“fileStream”,因为它不在线。

然后它建议通过T-SQL备份数据库只备份在线文件组。然而,这不是我的要求。

我想使脱机文件组再次联机。我看到了这个答案,它建议使用alter database命令使 fielgroup 脱机。

alter database dn_name
modify file (name='filegroup_name', offline)
go
Run Code Online (Sandbox Code Playgroud)

但是,正如我看到的上述命令的文档,没有选项可以让 fielgroup 重新联机。我该怎么办?如何在 SQL Server 2012 中使文件组(或文件)重新联机?

sql-server filegroups

5
推荐指数
1
解决办法
1786
查看次数

通过 T-SQL 在 SQL Server 中获取对象脚本?

我需要获取SQL Server 数据库中对象的创建脚本。我需要用于创建它的完全相同的脚本。就像当您使用 SSMS 更改已定义的视图时,脚本就在那里,就像您之前定义的那样。

我需要在 T-SQL 中执行此操作。SQL Server 在哪里存储与数据库对象相关的脚本?我在系统目录视图中找不到相关视图。

我试图找到的是这样的:

select creation_script -- I know this column doesn't exist
from sys.objects
where name = 'CustomersView'
Run Code Online (Sandbox Code Playgroud)

sql-server scripting

5
推荐指数
2
解决办法
1万
查看次数

如何在巨大的负载下在巨大的事务数据库中将主键的数据类型从 int 更改为 bigint?

这是一个遗留系统,每天处理 1000 万笔交易的表中有超过 10 亿条记录。

现在应用程序抱怨:

将 IDENTITY 转换为数据类型 int 时出现算术溢出错误

我们想将该id列的数据类型更改为bigint,但它无法执行并且超时。

我们应该做什么?我一点头绪也没有。我们无法停止系统,因为它是一个单一的应用程序和数据库,可以做很多事情。因此,我们不希望停止整个系统。

我们正在使用 SQL Server 10.50.6000.34,即 SQL Server 2008 R2 SP3(2014 年 9 月)

sql-server alter-table identity

5
推荐指数
2
解决办法
2191
查看次数

如何以事务方式从两个表中选择记录

我有Messages一个包含字段的表和另一个名为 的表SentMessages,它与该表具有一对一的关系Messages

Messages 存储有关消息的信息,包括其文本、主题和收件人等。

create table Messages
(
    Id bigint not null identity(1, 1) primary key,
    Text nvarchar(max),
    Subject nvarchar(400)
    -- other fields
)
Run Code Online (Sandbox Code Playgroud)

SentMessages 存储与将消息传输到客户端相关的信息。

create table SentMessages
(
    Id bigint not null primary key,
    SentOn datetime not null,
    DeliveredOn datetime null,
    -- other fields
)
go
alter table SentMessages with check add constrait [FK_SentMessages_Messages] 
foreign key([Id])
references Messages ([Id])
Run Code Online (Sandbox Code Playgroud)

它们被设计为独立的,所以请不要对合并它们提出建议。

现在的逻辑是找到所有尚未发送的消息,然后发送它们。基本上not in,单线程场景中的一个简单子句就可以解决问题:

select *
from Messages
where Id not in …
Run Code Online (Sandbox Code Playgroud)

sql-server

5
推荐指数
1
解决办法
273
查看次数

varchar(max)、nvarchar(max) 和 varbinary(max) 列会影响选择查询吗?

考虑这个表:

create table Books
(
    Id bigint not null primary key identity(1, 1),
    UniqueToken varchar(100) not null,
    [Text] nvarchar(max) not null
)
Run Code Online (Sandbox Code Playgroud)

假设这张表中有超过 100,000 本书。

现在我们有 10,000 本书数据要插入到这个表中,其中一些是重复的。所以我们需要先过滤重复,然后再插入新书。

检查重复项的一种方法是这样的:

select UniqueToken
from Books 
where UniqueToken in 
(
    'first unique token',
    'second unique token'
    -- 10,000 items here
)
Run Code Online (Sandbox Code Playgroud)

Text列的存在是否会影响此查询的性能?如果是这样,我们如何优化它?

PS 我有相同的结构,对于其他一些数据。而且它的表现并不好。一个朋友告诉我,我应该把我的桌子分成两张桌子,如下所示:

create table BookUniqueTokens 
(
    Id bigint not null primary key identity(1, 1),
    UniqueToken varchar(100)
)

create table Books
(
    Id bigint not null primary key,
    [Text] nvarchar(max)
) …
Run Code Online (Sandbox Code Playgroud)

performance sql-server datatypes t-sql

5
推荐指数
1
解决办法
2649
查看次数

为什么视图中选择查询中完全确定性和包罗万象的“案例”的结果可以为空?

我有一张桌子,Id作为主键。

create table Anything
(
    Id bigint not null primary key identity(1, 1)
)
Run Code Online (Sandbox Code Playgroud)

当我查看 中的这张表时Object Explorer,我当然会看到这张图片:

在此处输入图片说明

正如你所看到的,列Id不为空

然后我在这个虚拟表上创建一个虚拟视图:

create view IdIsTwoView
as

select
    Id,
    (
        case
        when Id = 2
        then cast(1 as bit)
        else cast(0 as bit)
        end
    ) as IdIsTwo
from Anything
Run Code Online (Sandbox Code Playgroud)

但这一次,在对象资源管理器中,我看到了这个结果:

在此处输入图片说明

如您所见,尽管我的case子句包罗万象,涵盖了所有记录的 100%,并且对所有记录都有答案,但它可以为空。

为什么 SQL Server 有这种奇怪的行为?我如何强制它不为 null

PS我们有一个动态生成代码的基础设施,这种行为给我们带来了麻烦,我们必须手动将bool?C# 中的所有类型更改为bool.

null sql-server view sql-server-2016 computed-column

4
推荐指数
2
解决办法
285
查看次数