我见过很多人使用 COALESCE 函数代替 ISNULL。从 Internet 搜索中,我发现 COALESCE 是 ANSI 标准,因此有一个优势,即我们知道使用它时会发生什么。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。
我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言中表现不同。
在我看来,所有这些都归结为风格和标准。鉴于风格是主观的,有没有理由在 ISNULL 上使用 COALESCE(反之亦然)?具体来说,一个比另一个有性能优势吗?
我今天有一个由其他人创建的 .bak 文件,通过 SSMS 2008 R2 手动创建。我正在尝试手动恢复数据库,不幸的是,当我浏览它时该文件没有出现。
我可以编写恢复过程的脚本,但我以前见过这个问题,我不确定是什么原因导致 .bak 不出现。
鉴于以下组件
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
可能的重复:
为什么使用 int 作为查找表的主键?
到目前为止,我习惯于为每个表创建一个 ID 列,它的实用性使我不必考虑有关主键理论的决策。
我大学的教授建议全班从一个或多个字段制作主键,这些字段构成关于每一列的一个唯一信息。是的,我想养成使用自然键而不是代理键的习惯。维基百科上列出了代理键的优缺点,我严格推荐这篇文章
我见过人们对所有内容都使用整数 ID 字段,但没有人评判这种方法,因为
我开始认为额外的 ID 字段只是创建冗余数据而没有实际好处。那么当我可以使用其他列作为关键字段时,为什么还要创建 ID 列呢?

另一方面
额外资源:
我从阅读文章中得出的结论是,我应该尽可能使用自然键,而不是每次都跳过考虑自然键并使用代理键,好像这是一个标准。
今天在对服务代理问题进行故障排除时,我发现数据库所有者是离开公司的员工的 Windows 登录名。他的登录名已被删除,因此查询通知失败。
据说处理这个问题的最佳实践是让“sa”成为数据库所有者。我们更改了它并清除了队列。
我的(非常基本的)问题:数据库所有者是什么,其目的是什么?
我已经设置了一台运行 Windows Server 2008 的服务器,并安装了 SQL Server 2008 Express。
我可以通过以下方式连接到机器的 SQL Server Express 数据库 MACHINENAME/SQLEXPRESS.
但是,当我们使用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 2014 Express数据库的备份导入到其他服务器,发现两者之间的文件大小的差异.bacpac和.bak。
为什么一个.bacpac文件比.bak同一个数据库的文件那么小?
感谢您的任何见解!
我知道 你 不能有 ORDER BY一个视图。(至少在我使用的 SQL Server 2012 中)
我也明白对视图进行排序的“正确”方法是ORDER BY在SELECT查询视图的语句周围放置一个。
但是对于实际的 SQL 和视图的用法相对较新,我想了解为什么这是设计使然。如果我正确地遵循了历史记录,这曾经是可能的,并且已从 SQL Server 2008 等中明确删除(不要引用我的确切版本)。
但是,我能想到的关于 Microsoft 删除此功能的最佳理由是因为“视图是未排序的数据集合”。
我假设有一个很好的、合乎逻辑的理由来解释为什么 View 应该未排序。为什么视图不能只是扁平化的数据集合?为什么特别未排序?想出这样的情况似乎并不难(至少对我/恕我直言)拥有排序视图似乎非常直观。
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 条件,它似乎就退出了。有人可以确认是否是这种情况。