标签: sql-server

COALESCE 与 ISNULL 的性能差异?

我见过很多人使用 COALESCE 函数代替 ISNULL。从 Internet 搜索中,我发现 COALESCE 是 ANSI 标准,因此有一个优势,即我们知道使用它时会发生什么。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。

我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言中表现不同。

在我看来,所有这些都归结为风格和标准。鉴于风格是主观的,有没有理由在 ISNULL 上使用 COALESCE(反之亦然)?具体来说,一个比另一个有性能优势吗?

sql-server syntax

57
推荐指数
3
解决办法
5万
查看次数

.bak 文件在 SSMS 的任何目录中都不可见

我今天有一个由其他人创建的 .bak 文件,通过 SSMS 2008 R2 手动创建。我正在尝试手动恢复数据库,不幸的是,当我浏览它时该文件没有出现。

我可以编写恢复过程的脚本,但我以前见过这个问题,我不确定是什么原因导致 .bak 不出现。

sql-server backup ssms

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

SCHEMABINDING 万圣节保护之外的功能是否有任何好处?

众所周知,SCHEMABINDING一个函数可以避免更新计划中不必要的假脱机

如果您使用不涉及任何表(即不访问数据)的简单 T-SQL UDF,请确保SCHEMABINDING在创建 UDF 期间指定该选项。这将使 UDF 模式绑定并确保查询优化器不会为涉及这些 UDF 的查询计划生成任何不必要的假脱机运算符。

SCHEMABINDING即使不访问数据,函数还有其他优势吗?

sql-server functions

56
推荐指数
1
解决办法
8625
查看次数

如何在 SQL Server 中将日期和时间与 datetime2 结合起来?

鉴于以下组件

DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Run Code Online (Sandbox Code Playgroud)

将它们结合起来以产生DATETIME2(7)具有价值的结果的最佳方法是'2013-10-13 23:59:59.9999999'什么?

有些东西工作,如下表所示。


SELECT @D + @T 
Run Code Online (Sandbox Code Playgroud)

操作数数据类型日期对加法运算符无效。


SELECT CAST(@D AS DATETIME2(7)) + @T 
Run Code Online (Sandbox Code Playgroud)

操作数数据类型 datetime2 对加法运算符无效。


SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
Run Code Online (Sandbox Code Playgroud)

datediff 函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试将 datediff 与不太精确的日期部分一起使用。

* 可以在 Azure SQL 数据库和 SQL Server 2016 中避免溢出,使用DATEDIFF_BIG.


SELECT CAST(@D AS DATETIME) + @T 
Run Code Online (Sandbox Code Playgroud)

数据类型 datetime 和 time 在 add 运算符中不兼容。


SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

返回结果但失去精度 2013-10-13 23:59:59.997

sql-server datatypes date time datetime2

55
推荐指数
3
解决办法
6万
查看次数

当我可以使用其他人作为关键字段时,为什么要创建 ID 列?

可能的重复:
为什么使用 int 作为查找表的主键?

到目前为止,我习惯于为每个表创建一个 ID 列,它的实用性使我不必考虑有关主键理论的决策。

我大学的教授建议全班从一个或多个字段制作主键,这些字段构成关于每一列的一个唯一信息。是的,我想养成使用自然键而不是代理键的习惯。维基百科上列出了代理键的优缺点,我严格推荐这篇文章

我见过人们对所有内容都使用整数 ID 字段,但没有人评判这种方法,因为

  • 它“看起来”高效
  • 使用了一个数字字段,它看起来更酷,因为它在内存中每行的大小

我开始认为额外的 ID 字段只是创建冗余数据而没有实际好处。那么当我可以使用其他列作为关键字段时,为什么还要创建 ID 列呢?

  • 如果您的 ID 字段是 32 位,则它已经相当于 4 个 ASCII 字符。
  • 如果您的 Id 字段是64 位整数,则它是8 个字符的字符串,因此它实际上并没有节省那么多内存(这里暗示的是用于比较的内存。额外的 id 列已经添加到使用的内存中(HDD 和 RAM) ) )
  • 额外的 ID 字段会使您的索引成本加倍,因为您还将索引一个可以用作主键的唯一字段。
  • 如果您需要可以用作关键字段的数据,则进行额外的联接,例如,如果您在一篇博客文章中存储了唯一的用户 ID,以显示作者姓名,则进行联接查询,如果您的密钥字段是作者的名字,你不需要加入,因为你将相关数据存储在博客帖子表中。具有有意义数据的外键字段减少了子查询或连接的需要

在此处输入图片说明

  • 创建一个额外的 id 字段“添加”到内存负载,它不是唯一字符串字段的替换,您不是用整数替换 char-varchar 字段,而是添加一个额外的列并创建额外的数据流。所以任何数据存储的比较都应该在“string”和“int+string”之间进行。添加整数 id 字段不节省空间。

另一方面

  • 分配从用户输入中获取价值的主键数据可能会出现问题,因为人们可能会输入错误的社会安全号码,并且由于独特的政策,想要注册的实际人员将无法注册。这可以通过在原始号码上添加一个或多个额外数字来规避。

额外资源:

  1. 自然vc代理键的比较

我从阅读文章中得出的结论是,我应该尽可能使用自然键,而不是每次都跳过考虑自然键并使用代理键,好像这是一个标准。

mysql sql-server primary-key uniqueidentifier surrogate-key

54
推荐指数
4
解决办法
4万
查看次数

数据库“所有者”的目的是什么?

今天在对服务代理问题进行故障排除时,我发现数据库所有者是离开公司的员工的 Windows 登录名。他的登录名已被删除,因此查询通知失败。

据说处理这个问题的最佳实践是让“sa”成为数据库所有者。我们更改了它并清除了队列。

我的(非常基本的)问题:数据库所有者是什么,其目的是什么?

sql-server-2008 sql-server permissions service-broker

54
推荐指数
2
解决办法
7万
查看次数

我无法通过 IP 地址连接到我的服务器 SQL 数据库

我已经设置了一台运行 Windows Server 2008 的服务器,并安装了 SQL Server 2008 Express。

我可以通过以下方式连接到机器的 SQL Server Express 数据库 MACHINENAME/SQLEXPRESS.

但是,当我们使用IP 地址通过任何软件或脚本进行连接时连接时,它将不允许连接。

我试过了:

  • 关闭防火墙。
  • 允许 SQL 数据库的远程连接。
  • 在 SQL 配置中启用 TCP/IP。

当我们尝试通过软件“SQL Server Management Studio”进行连接时,我们收到以下消息:

错误信息:

与服务器建立连接时发生错误。连接到 SQL Server 2005 时,此失败可能是由于 SQL Server 在默认设置下不允许远程连接造成的。(提供者:TCP 提供者,错误:0 - 由于目标机器主动拒绝,无法建立连接。)(Microsoft SQL Server,错误:10061)

已成功与服务器建立连接,但随后在登录过程中出现错误。(提供程序:TCP 提供程序,错误:0 - 已建立的连接被主机中的软件中止。)(Microsoft SQL Server,错误:10053)

你能告诉我你什么时候有空吗,这样我们就可以看看,因为我似乎知道在哪里,我已经根据 UK Fast 发给我的一些信息修改了细节,但他们说“这不在支持范围内” ,所以他们无能为力。

我期待着您的回音。

sql-server-2008 sql-server

54
推荐指数
3
解决办法
40万
查看次数

与同一数据库的 .bak 文件相比,为什么 .bacpac 文件如此之小?

我一直在做我的SQL Server 2014 Express数据库的备份导入到其他服务器,发现两者之间的文件大小的差异.bacpac.bak

为什么一个.bacpac文件比.bak同一个数据库的文件那么小?

感谢您的任何见解!

sql-server backup export import

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

为什么 ORDER BY 不属于视图?

知道 不能有 ORDER BY一个视图。(至少在我使用的 SQL Server 2012 中)

我也明白对视图进行排序的“正确”方法是ORDER BYSELECT查询视图的语句周围放置一个。

但是对于实际的 SQL 和视图的用法相对较新,我想了解为什么这是设计使然。如果我正确地遵循了历史记录,这曾经是可能的,并且已从 SQL Server 2008 等中明确删除(不要引用我的确切版本)。

但是,我能想到的关于 Microsoft 删除此功能的最佳理由是因为“视图是未排序的数据集合”。

我假设有一个很好的、合乎逻辑的理由来解释为什么 View 应该未排序。为什么视图不能只是扁平化的数据集合?为什么特别排序?想出这样的情况似乎并不难(至少对我/恕我直言)拥有排序视图似乎非常直观。

sql-server order-by

53
推荐指数
4
解决办法
6万
查看次数

SQL Server CASE 语句是评估所有条件还是在第一个 TRUE 条件时退出?

SQL Server(特别是 2008 或 2012)CASE语句是评估所有WHEN条件还是在找到WHEN评估为真的子句后退出?如果它确实通过了整个条件集,这是否意味着最后一个条件评估为 true 会覆盖第一个评估为 true 的条件所做的事情?例如:

SELECT
    CASE
        WHEN 1+1 = 2 THEN'YES'
        WHEN 1+1 = 3 THEN 'NO'
        WHEN 1+1 = 2 THEN 'NO' 
    END
Run Code Online (Sandbox Code Playgroud)

结果是“YES”,即使最后一个 when 条件应该使它评估为“NO”。一旦找到第一个 TRUE 条件,它似乎就退出了。有人可以确认是否是这种情况

sql-server t-sql case

53
推荐指数
3
解决办法
11万
查看次数