Questions tagged «sql-server»

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

3
检查子查询结果中是否有任何值
我有一个复杂的子查询,该查询返回订单ID列表。我需要获得拥有这些订单的客户列表。问题是有两种将客户分配给订单的方式(两个字段之一)。我可以做这样的事情: select * from Customers where orderId in (select...) or secondaryOrderId in (select ...) 问题在于,子查询在执行时间和屏幕空间上都是巨大的。有没有一种方法可以检查其中一个字段是否包含所需结果之一?

1
对SQL Server 2000中所有表,视图,过程的GRANT权限
我想知道是否存在使用SQL Server 2000语法的T-SQL来对特定数据库的所有表和视图进行GRANT SELECT,INSERT,UPDATE,DELETE的相当有效的方法,但不包括100个对象中的2个或3个。我还希望能够对所有存储过程授予EXEC特权。 目前,我正在使用以下代码逐一更改它们。对大约100个表和100个视图执行此操作将花费太长时间,并且通过GUI花费的时间甚至更长(除非我也做错了)。 use [DATABASE_NAME] GO GRANT DELETE ON [dbo].[table_name]TO [user_name] GO use [DATABASE_NAME] GO GRANT INSERT ON [dbo].[table_name]TO [user_name] GO use [DATABASE_NAME] GO GRANT SELECT ON [dbo].[table_name]TO [user_name] GO use [DATABASE_NAME] GO GRANT UPDATE ON [dbo].[table_name]TO [user_name] GO 如何使用T-SQL在所有用户表和视图之间循环以授予某些特权,同时排除几个对象?

1
SQL Server,TOP与ROW_NUMBER
我正在学习执行计划,并尝试不同的查询并比较它们的性能,结果发现: SELECT StatisticID FROM ( SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn FROM FTCatalog.Statistic ) AS T WHERE T.rn <= 1000 ORDER BY rn SELECT TOP 1000 StatisticID FROM FTCatalog.Statistic ORDER BY StatisticID 它们都返回相同的结果集-但是第一个执行速度更快,资源占用更少(至少SSMS告诉我),以下是执行计划: 与SQL Query Plan Explorer的比较: 谁能给我一些有关幕后实际发生情况的信息,以及为什么结果有所不同?如果您还有其他需要,请告诉我。 谢谢,伊瓦达斯。

1
共享驱动器上的即时文件初始化
之前我曾问过类似的问题,但以前我曾问过有关将备份移到共享位置的问题。这次我很好奇:如果要还原共享驱动器上的数据库,是否需要在该服务器上或仅在运行SQL Server的服务器上启用IFI? 我问的原因是我正在还原一个非常大的数据库,并且在最近几个小时内一直处于100%恢复状态。等待类型sp_whoisactive为: (28472716ms) `PREEMPTIVE_OS_WRITEFILEGATHER. 我唯一看到的是未启用IFI的情况,但是我确实在SQL Server上启用了该功能,但在共享驱动器服务器上却未启用它。

1
SQL Server的页面预期寿命是否过高?
我已经阅读了几篇有关SQL Server的页面预期寿命及其含义以及可以从中获取哪些信息的文章。在我阅读的大多数这些文章中,一个常见的健康PLE值大约为1000-2000秒。我读过,缩短到300秒左右可能意味着您的RAM可能不足。 我最近刚刚将硬件升级到64GB的RAM,从14GB升级到了64GB。在14GB内存上,我的PLE大约需要300秒,而每秒我有很多5-6个内存授权待处理。因此,那很糟糕,我增加了RAM。现在,我的PLE大大提高了,大约是5000秒,并且不再有待决的内存授予。如果我记得的话,我已经看了7000秒。这比我读过的任何东西都要高。 PLE可能是一件坏事吗?还是越高越好? 编辑:对不起,我的PLE不是7000秒,而是70,000秒!尽管目前下降到7000左右。 数据库大小约为160GB。一些表有5+百万行。 max_server_memory 设置为2147483647。

2
如何查看整个作业步骤的输出?
我们有一个运行某些PowerShell的SQL Agent作业,这会创建一个相当长的输出(除其他外,它具有robocopy输出)。 在“ SQL代理作业历史记录”中,我们仅看到此输出的前1,000个字符左右。 我们还有另一个可以看到整个输出的地方吗? 是否应该使用另一种方法来查看完整的输出?

9
错误:无法生成SSPI上下文
当某人尝试连接到SQL Server实例时,出现错误: 不可能生成SSPI上下文。 昨天我们停电了(不知道该用英语怎么说),我不得不关闭服务器。 寻找答案,我发现了这一点: SQL Server 2008连接问题:无法生成SSPI上下文 但这对我没有帮助,因为直到昨天他们都工作正常。我什么都不想改变。但是如果有必要,我会改变它。 Obs:我现在无法重新启动服务器。 编辑:自从我回答以来,我们没有任何错误。

2
SQL Server累积更新-在Windows Update中不可见
我刚刚在WS2008R2 / SQL2012实例上安装了所有可能的Windows更新。当我跑步 SELECT @@VERSION 我懂了 Microsoft SQL Server 2012 - 11.0.5058.0 (X64) May 14 2014 18:34:29 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) 根据 http://sqlserverbuilds.blogspot.com/ 在Microsoft网站和Microsoft网站上,有4个针对SQL Server 2012 SP2的累积更新可用,而最新版本为11.00.9000。 Windows Update为什么也没有获得累积更新?我应该手动下载并安装它们吗?

1
如何在SSRS报表中传递多值字符?
我有一个SSRS报告,其中包含3个数据集,它们来自一个数据源。主数据集是一个存储过程,它基于由其他两个数据集提供支持的一组参数来聚合某些数据。 支持该报告的主要存储过程具有4个参数。一个是数据类型的ID,两个是开始日期和结束日期,第三个只是标记参数。flag参数是多值参数,我想在其中传递多个也是VARCHAR值的标志值。 在我的@Flag参数的存储过程中,我有一个共同点: WHERE [Flag] IN (@Flag) 然后,当然,SSRS报表上的@Flag参数设置为允许“多个值”,这些值也从从维度表中提取那些@Flag值的查询中填充。 我的问题 在大多数情况下,处理INT值时,可以使用相同的技术。但是,当我处理字符值时,它会失败。如果我选择一个标志,该报告将产生神奇效果。如果选择多个标志,则似乎无法正确将标志传递给存储过程,并且不会返回任何结果。 在存储过程中直接测试多值标志时: WHERE [Flag] IN ('A', 'B', 'C') 该存储的过程正常工作。因此,问题不在于存储过程,而是SSRS如何将多值传递给@Flag参数。 尝试过的解决方案 我尝试为此@Flag参数对SSRS数据集进行以下调整: =join(Parameters!<your param name>.Value,",") 还有这个: =SPLIT(JOIN(Parameters!<your param name>.Value,","),",") 这些都适用于单个值,但不适用于多个值。 我在这里想念什么?

4
我应该在什么时候拆分或分割一个很大但很简单的表
我们的网站上有一些大而简单的统计表(INT,INT,DATE)。每个表最多有300,000,000行,并且每天都在增加。 托管服务提供商建议我们拆分表或对表进行分区,而我在许多场合也看到了此建议。 然而... 我正在努力使建议与SQL Server的最大容量(数据库大小为524,272 TB)保持一致,而表行仅受“可用存储”限制。 根据这些数字,上述表格可以轻松地拥有数以百万计的行(10 等于 303的幂)。 啊哈,您可能会说,CAPABILITY和PERFORMANCE之间是有区别的。 但是,实际上在每个有关SQL Server性能的问题中,答案都是“这取决于表设计和查询设计”。 这就是为什么我问这个问题。桌子的设计再简单不过了。基于索引ID字段的简单count(*)操作查询也不能。

1
视图上的聚合操作将忽略索引
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 场景 曾几何时,一家小公司中有一个Staging数据库,该数据库正在参与ETL流程,充当来自多个第三方来源的各种格式文件的接收目录。E是通过DTS程序包处理的,几乎没有用于审计或控制的控制结构,但是被认为“足够好”,并且从所有意图和目的来看都是如此。 E部分提供的数据旨在供单个应用程序使用,并由少数年轻有能力的程序员开发和管理。尽管他们缺乏当时的数据仓库技术经验或知识,但他们还是根据应用程序代码创建并创建了自己的T和L流程。这些崭露头角的软件工程师大胆创新,发明了局外人所谓的“低于理想的轮子”,但是凭借“足够好”作为永远存在的服务水平,他们能够提供一个操作框架。 一段时间以来,在紧密耦合的领域中一切都很好,暂存目录以12个第三方的数据为美食,反过来又由应用程序提供。随着应用程序的增长,它的胃口也随之增加,但是随着熟练的白骑士开发人员对系统的观察,这些胃口很快得到了解决,在很多情况下甚至都得到了很好的解决。 但是,黄金时代不可能永远持续下去。随着成功应用程序的繁荣,业务不断发展。随着它的增长,登台环境和应用程序也随之增长。尽管他们保持了警惕,但只有少数英雄开发人员无法跟上现在扩展的系统的维护,并且消费者已经有权使用其数据。不再是他们需要甚至想要的事了,但是民众感到他们只是应得的,甚至要求更多。 有了很多钱,武装起来的公司就进入了市场,雇用了开发人员和管理员来帮助支持不断发展的系统。各式各样的雇佣兵蜂拥而至,但是随着这种增长突飞猛进,可用的专家指导却很少。新的开发人员和管理人员都在努力理解自制套件的复杂性,直到挫折导致全面的战争。每个部门都开始尝试单独解决每个问题,相互之间的工作比相互之间的工作更多。一个项目或计划将以几种不同的方式实施,每种方式与下一个略有不同。对于某些白骑士来说,这一切的压力实在太大了,当他们沦陷时,帝国崩溃了。不久,系统陷入混乱, 尽管这些承诺可以转换成意大利面条代码的领域已经发生了变化,但该公司还是坚持了下来。毕竟是“足够好”。 挑战 后来发生了一些政权更迭和招聘热潮,我发现自己从事公司的雇用。自大战以来已经有很多年了,但是所造成的损失仍然非常明显。我设法解决了系统E部分中的一些弱点,并以将DTS软件包升级到SSIS为幌子添加了一些控制表,现在一些实际的数据仓库专业人员正在使用它们创建正常的并记录了T和L替换。 第一个障碍是从第三方文件中导入数据,这种方式不会截断值或更改本机数据类型,但还包括一些用于重新加载和清除的控制键。这一切都很好,但是应用程序需要能够以无缝,透明的方式访问这些新表。DTS包可以填充一个表,然后由应用程序直接读取该表。由于QA的原因,SSIS升级需要并行进行,但是这些新软件包包括各种控制键,并且还利用了分区方案,更不用说实际的元数据更改足以显着保证一个新表的总和,因此新表用于新的SSIS包。 随着可靠的数据导入现已开始运作,并且由仓库团队使用,真正的挑战在于将新数据提供给直接访问暂存环境的应用程序,而对应用程序代码的影响最小(也称为“否”)。为此,我选择使用视图,重命名表(例如dbo.DailyTransactionto)dbo.DailyTranscation_LEGACY并dbo.DailyTransaction为视图重用对象名称,这实际上只是从现在开始选择所有内容。LEGACY指定表。由于从业务的角度来看,重新加载这些表中包含的数据的年数是不可行的,因为新的SSIS填充和分区表已进入生产阶段,因此关闭了旧的DTS导入,并且应用程序必须能够以及访问新表中的新数据。此时,将更新视图以在dbo.DailyTransactionComplete可用时从新表(例如)中选择数据,而在不可用时从旧表中选择数据。 实际上,正在执行以下操作: CREATE VIEW dbo.DailyTransaction AS SELECT DailyTransaction_PK, FileDate, Foo FROM dbo.DailyTransactionComplete UNION ALL SELECT DailyTransaction_PK, FileDate, Foo FROM dbo.DailyTransaction_LEGACY l WHERE NOT EXISTS ( SELECT 1 FROM dbo.DailyTransactionComplete t WHERE t.FileDate = l.FileDate …


3
当存储过程可以由不同的用户同时运行时,是否建议使用临时表?
我正在研究一种从活动目录检索objectGUID的存储过程。我将结果存储在临时表中,然后在输出参数中返回该值以用于其他进程。将通过不同的存储过程以及Web应用程序PHP,ASP Classic和ASP.Net调用SP。 我在这里读到(关于临时表): 如果在存储过程中创建,则它们将在存储过程完成时销毁。此外,任何特定临时表的范围都是创建该临时表的会话。表示仅对当前用户可见。多个用户可以创建一个名为#TableX的临时表,并且同时运行的任何查询都不会相互影响-他们将保持自主事务,而这些表保持自主对象。您可能会注意到我的示例临时表名称以“#”符号开头。 听起来我很高兴,但我想获得一些建议,以确保没有我不知道的陷阱。这是SP。 提前致谢。 CREATE PROCEDURE stp_adlookup @user varchar(100), @objectGUID varbinary(256) OUTPUT AS SET NOCOUNT ON; DECLARE @qry char(1000) CREATE TABLE #tmp( objectGUID nvarchar(256) ) SET @qry = 'SELECT * FROM openquery(ADSI, '' SELECT objectGUID FROM ''''LDAP://mydomaincontroller.com'''' WHERE sAMAccountName = ''''' + @user + ''''' '')' INSERT INTO …

5
将varchar数据类型转换为datetime数据类型导致超出范围的值
我正在尝试运行一个简单的查询来获取在11月创建的所有行: SELECT COUNT(*) FROM dbo.profile WHERE [Created] BETWEEN '2014-11-01 00:00:00.000' AND '2014-11-30 23:59:59.997'; SMSS返回: 从varchar数据类型到datetime数据类型的转换导致值超出范围。 我不明白为什么将“ Created”设置为datetime时将数据从varchar转换为datetime: 我需要告诉服务器“创建”是日期时间吗?如果没有,为什么我会收到此varchar消息? 编辑:数据库中的值为YYYY-MM-DD。下面来自@SqlZim的回复说,我需要使用convert()告诉sql数据库中的日期是什么格式-并将空格字符替换为字母T: select count(*) from dbo.profile where [created] between convert(datetime,'2014-11-01T00:00:00.000') and convert(datetime,'2014-11-30T23:59:59.997');`

2
SQL Server表插入性能优化
设置 在一个数据仓库中,我将一个事实表连接到20个维度。事实表具有3200万行和30列。这是一个临时暂存表,因此我不必与其他正在读取或写入该表的用户打交道。我从基础表中选择10列,并从各个维度中选择20列。尺寸表很小(介于3到15.000行之间)。连接的字段都是整数和nvarchars。我使用SELECT ... INTO语句。表上没有索引。 该查询的执行速度太慢,无法使用。 尝试过的解决方案 因为查询处理时间太长,所以我尝试了以下解决方案: 将20个联接拆分为5个表上的4个联接。但是查询性能仍然很低。 将索引放在外键列上。没有明显的时间减少。 确保联接条件的字段为整数。我注意到性能提高了25%。不完全是我要寻找的。 使用insert into语句代替select into。尽管数据库处于简单恢复模式,但由于日志文件增长而导致性能更差。 这些发现使我包括了实际的执行计划,该计划表明89%的成本在表插入中。其他成本是对事实表进行8%的表扫描,对内部联接进行2%的哈希匹配。 问题 缓慢插入表的可能原因是什么? 没有执行计划,有哪些方法可以识别此瓶颈? 我可以采取什么措施来减少表格插入的费用?

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.