Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

6
在仅使用文字值的WHERE子句中替换ISNULL()的不同方法有哪些?
这不是关于: 这不是接受用户输入或使用变量的全部查询的问题。 这是严格,对查询ISNULL()中使用WHERE条款,以取代NULL与金丝雀值值进行比较的谓语,而不同的方式来重写这些查询以优化搜索在SQL Server中。 你为什么不坐在那儿? 我们的示例查询针对SQL Server 2016上Stack Overflow数据库的本地副本,并查找NULL年龄小于或小于18的用户。 SELECT COUNT(*) FROM dbo.Users AS u WHERE ISNULL(u.Age, 17) < 18; 查询计划显示对相当周到的非聚集索引的扫描。 扫描操作符显示(由于在SQL Server的最新版本中对实际执行计划XML的添加),我们读取了每一个臭行。 总体而言,我们进行9157次读取,并占用大约半秒的CPU时间: Table 'Users'. Scan count 1, logical reads 9157, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. …
55 sql-server 

2
如何创建Unicode参数和变量名
所有这些工作: CREATE DATABASE [¯\_(ツ)_/¯]; GO USE [¯\_(ツ)_/¯]; GO CREATE SCHEMA [¯\_(ツ)_/¯]; GO CREATE TABLE [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]([¯\_(ツ)_/¯] NVARCHAR(20)); GO CREATE UNIQUE CLUSTERED INDEX [¯\_(ツ)_/¯] ON [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]([¯\_(ツ)_/¯]); GO INSERT INTO [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]([¯\_(ツ)_/¯]) VALUES (N'[¯\_(ツ)_/¯]'); GO CREATE VIEW [¯\_(ツ)_/¯].[vw_¯\_(ツ)_/¯] AS SELECT [¯\_(ツ)_/¯] FROM [¯\_(ツ)_/¯].[¯\_(ツ)_/¯]; GO CREATE PROC [¯\_(ツ)_/¯].[sp_¯\_(ツ)_/¯] @Shrug NVARCHAR(20) AS SELECT [¯\_(ツ)_/¯] FROM [¯\_(ツ)_/¯].[vw_¯\_(ツ)_/¯] …

11
将数组参数传递给存储过程
我有一个过程,可以捕获一堆记录(1000条记录)并对其进行操作,完成后,我需要将大量记录标记为已处理。我可以用大量的ID来表明这一点。我试图避免使用“循环更新”模式,因此我想找到一种更有效的方法来将此ID包发送到MS SQL Server 2008存储的proc中。 提案1-表格值参数。我可以定义一个带有ID字段的表类型,然后发送一个包含ID的表进行更新。 提案2-proc正文中带有OPENXML()的XML参数(varchar)。 提案3-列表解析。如果可能的话,我宁愿避免这种情况,因为它似乎笨拙且容易出错。 其中有什么偏好,或者我错过了任何想法?

2
如何用表值函数联接表?
我有一个用户定义的函数: create function ut_FooFunc(@fooID bigint, @anotherParam tinyint) returns @tbl Table (Field1 int, Field2 varchar(100)) as begin -- blah blah end 现在,我想将其加入另一个表,如下所示: select f.ID, f.Desc, u.Field1, u.Field2 from Foo f join ut_FooFunc(f.ID, 1) u -- doesn't work where f.SomeCriterion = 1 换句话说,对于所有Foo记录,其中SomeCriterion均为1,我想查看Foo ID和Desc以及输入所返回的Field1和的值。Field2ut_FooFuncFoo.ID 这样做的语法是什么?

1
除万圣节保护外,SCHEMABINDING功能还有什么好处?
众所周知,SCHEMABINDING函数可以避免更新计划中不必要的假脱机: 如果您使用的是不触摸任何表(即不访问数据)的简单T-SQL UDF,请确保SCHEMABINDING在创建UDF时指定了该选项。这将使UDF成为模式绑定,并确保查询优化器不会为涉及这些UDF的查询计划生成任何不必要的假脱机操作符。 SCHEMABINDING即使不访问数据,该功能还有其他优点吗?

3
添加通配符时,SQL Server查询的速度显着下降(或顶部)
我有一个2千万只动物的动物园,可以在我的SQL Server 2005数据库中进行跟踪。其中约1%是黑色,其中约1%是天鹅。我想获取所有黑天鹅的详细信息,因此,不想淹没我所做的结果页面: select top 10 * from animal where colour like 'black' and species like 'swan' (是的,不建议您将这些字段设置为自由文本,但是它们都已编入索引)。事实证明,我们没有这种动物,因为查询会在大约300毫秒内返回空集。如果我使用'='而不是'like',它的速度大约是以前的两倍,但是我有一个预感,后者将为我节省一些输入时间。 事实证明,动物园的负责人认为他可能输入了一些“黑色”的天鹅,因此我相应地修改了查询: select top 10 * from animal where colour like 'black%' and species like 'swan' 事实证明,这些都不存在(事实上,除了“黑色”动物之外,没有“黑色%”动物),但是查询现在大约需要30秒才能返回空值。 看来这只是“ top”和“ like%”的组合造成麻烦,尽管 select count(*) from animal where colour like 'black%' and species like 'swan' 很快返回0,甚至 …

7
为什么ORDER BY不属于View?
我了解 您 无法拥有 ORDER BY视野。(至少在我正在使用的SQL Server 2012中) 我也理解排序视图的“正确”方法是通过在查询视图ORDER BY的SELECT语句周围放一个。 但是,对于实际的SQL和视图的用法而言,它相对较新,所以我想了解为什么这是设计使然。如果我正确地遵循了历史记录,这曾经是可能的,并且已从SQL Server 2008中明确删除,依此类推(请不要在确切的版本上引用我的意思)。 但是,我想出Microsoft为什么删除此功能的最佳理由是因为“视图是未排序的数据集合”。 我假设有一个很好的,合理的理由来说明为什么View应该不排序。为什么视图不能只是扁平化的数据收集?为什么特别未排序?似乎很难(至少对我/恕我直言)提出一种具有排序视图的情况。


4
在2008 R2上优于SQL Server 2012的客观业务原因是什么?
我的公司正在决定是否要为新的数据库服务器购买SQL Server 2012 Denali或SQL Server 2008 R2。我正在寻找客观原因来选择一个。 我们的要求: 标准版(出于财务原因,并且不需要企业功能) OLTP工作负载(这意味着我们不需要新的窗口功能和列存储索引) 数据库大小10-100 GB 无需商业智能功能。只需要关系引擎 同步数据库镜像 目前,我知道以下原因: SQL Server 2012 Denali 最新版本 SQL Server 2008 R2 成熟的技术 我似乎找不到很多技术原因来偏爱一个。基本上,归结为选择能够成功运行的可靠技术,而不是可用的最新和最佳版本。 做出决定的客观原因是什么?

4
在SQL Server中创建可以保存存储过程结果的临时表的最简单方法是什么?
很多时候,在处理SQL Server时,我需要编写如下内容。 create table #table_name ( column1 int, column2 varchar(200) ... ) insert into #table_name execute some_stored_procedure; 但是,创建一个具有与存储过程相同的语法的表是一项繁琐的任务。例如,sp_helppublication的结果有48列!我想知道是否有任何简单的方法可以做到这一点。 谢谢。

5
为什么我不使用SQL Server选项“针对临时工作负载进行优化”?
我一直在阅读有关Kimberly Tripp的一些有关SQL Server计划缓存的精彩文章,例如:http : //www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/ 为什么甚至有“针对临时工作负载进行优化”的选项?这不应该一直都在吗?无论开发人员是否在使用即席SQL,为什么不在每个支持它的实例(SQL 2008+)上都启用此选项,从而减少缓存膨胀?


3
COALESCE与ISNULL的性能差异?
我已经看到很多人使用COALESCE函数代替ISNULL。通过互联网搜索,我发现COALESCE是ANSI标准,因此我们知道使用COALESCE的好处。但是,ISNULL似乎更易于阅读,因为它看起来更清楚自己在做什么。 我还意识到ISNULL有点棘手,因为它在不同的数据库服务器和不同的语言上有不同的作用。 在我看来,所有这些都归结为风格和标准。鉴于样式是主观的,是否有任何理由在ISNULL上使用COALESCE(反之亦然)?具体来说,是否有一个相对于另一个的性能优势?

7
如何在SQL Server中将日期和时间合并到datetime2?
鉴于以下组件 DECLARE @D DATE = '2013-10-13' DECLARE @T TIME(7) = '23:59:59.9999999' 将它们结合起来以产生DATETIME2(7)具有价值的结果的最佳方法是'2013-10-13 23:59:59.9999999'什么? 下面列出了一些无效的内容。 SELECT @D + @T 操作数数据类型日期对于加法运算符无效。 SELECT CAST(@D AS DATETIME2(7)) + @T 操作数数据类型datetime2对于加法运算符无效。 SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D) datediff函数导致溢出。分隔两个日期/时间实例的日期部分的数量太大。尝试将datediff与不太精确的datepart一起使用。 *使用可以避免在Azure SQL数据库和SQL Server 2016中发生溢出DATEDIFF_BIG。 SELECT CAST(@D AS DATETIME) + @T 数据类型datetime和time在add运算符中不兼容。 SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME) …

12
为什么不将主键/外键匹配用于联接?
据我所知,许多DBMS(例如mysql,postgres,mssql)仅使用fk和pk组合来约束对数据的更改,但是它们很少用于本地自动选择要连接的列(就像自然连接使用名称一样)。这是为什么?如果您已经用pk / fk定义了2个表之间的关系,为什么数据库无法弄清楚如果我将那些表联接起来,我想在pk / fk列上联接它们? 编辑:澄清一下: 假设我有一个table1和一个table2。table1在a列上有一个外键,该外键引用了table2的b列上的主键。现在,如果我加入这些表,则必须执行以下操作: SELECT * FROM table1 JOIN table2 ON table1.a = table2.b 但是,我已经使用键定义了table1.a引用table2.b,因此在我看来,让DBMS系统自动使用table1.a和table2.b作为联接列并不难,这样一个人可以简单地使用: SELECT * FROM table1 AUTO JOIN table2 但是,许多DBMS似乎并未实现这样的功能。
48 mysql  sql-server 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.