Questions tagged «sql-server»

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

3
在MS SQL数据库中记录庞大的相互关联的存储过程Web:什么工具或格式?
我希望这是一个比“阅读一千页的书”更短的答案的问题,但是,如果那是真实的情况,那就来问我。 我不是真正的DBA,我是一名软件开发人员,他意识到我们需要DBA,但我工作的商店的DBA为零。但是,我们的MS SQL数据库设计(包括几个核心存储过程)非常混乱。存储过程很慢,我们怀疑它们存在错误,但是我们甚至不知道它们应该如何工作,因此我们不知道如何修复它们。 首先,我决定将所有工作方式记录下来,然后开始单元测试,并建立一组单元测试,以帮助证明存储过程确实有效。他们执行的逻辑是我们应用程序的关键部分,您可以说,这是公司主要产品的“皇冠上的宝石”,并且其工作方式完全没有记载。 我正在寻找专业的DBA可能期望存在的特定技术文档,或者如果需要的话,可能会写自己理解一些相互调用的庞大的存储过程。 记录大型存储过程的通常格式是什么?每个In参数的期望值的描述(即“先决条件”,“后置条件”,即布尔参数,当您打开或关闭它时会发生什么变化,等等?) 通常如何记录它?仅SQL注释?特定于目的的外部工具?外部“文档”?除了MS SQL Management Studio,我们没有其他SQL工具,但是我们想知道是否有一种工具可以更好地理解,记录和测试我们的环境。也许这是问我问题的更好方法。我需要什么工具来解决我们的困境? 我们的目标是能够: 答:使用我们生成的文档或我们添加到环境中的任何工具来帮助理解这些过程应该如何工作,因此我们可以继续为存储过程创建单元测试范围。 B.向客户端应用程序开发人员展示如何正确调用这些复杂的存储过程。 C.对我们的存储过程进行单元测试。

3
如何控制SSMS连接对话框中列出的服务器的顺序?
当我们从SQL 2008-> 2012升级时,我当前的项目涉及很多数据库改组,重新分配硬件任务,重复进行。 一个小麻烦是SSMS中的连接对话框重新排列了服务器的顺序,以将最新的放置在最前面。鉴于在特定的一天我要连接到6到10台数据库服务器,并希望快速在列表中找到特定的服务器,因此这种行为比提供帮助更多的是障碍。 有没有一种方法可以禁用此行为,使服务器按字母顺序排列,或者按添加顺序排列……或者每次我连接到服务器时都不会更改的任何内容? 除此以外,是否有一种完全不同的方法可以更好地管理从列表/服务器场到特定服务器的连接? 我正在将SSMS用于SQL 2012(尽管我也对2008解决方案感到好奇)。
11 sql-server  ssms  tools 

1
为什么死锁图上有无害条目?
我正在尝试学习如何分析SQL Server 2008的死锁图,并且发现了大量带有空<victim-list>节点的条目。我不明白这些条目代表什么:如果没有受害者,我如何确定导致死锁的waitresource?这些条目是什么意思? 这是我看到的条目的快速示例: <deadlock-list> <deadlock> <victim-list /> <process-list> <process id="processd2b6508" taskpriority="0" logused="10000" waittime="31" schedulerid="63" kpid="9104" status="suspended" spid="69" sbid="0" ecid="184" priority="0" trancount="0" lastbatchstarted="2012-07-30T01:10:45.550" lastbatchcompleted="2012-07-30T01:10:45.550" clientapp=".Net SqlClient Data Provider" hostname="XXXXXXX" hostpid="3648" isolationlevel="read committed (2)" xactid="30461033" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> <executionStack> <frame procname="" line="1" sqlhandle="0x020000002340c50225c17d0eec9bf7c51129348edffd1c70" /> <!--About 2 more frame tags... --> …

5
SQL Server是否等同于Oracle RAC的功能?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 我做了一些谷歌搜索,比几年前还没有找到这个问题的答案,所以我想问一下。Oracle的RAC功能可为读写事务提供负载平衡,并且可在不停机的情况下实现横向扩展和高可用性(至少据我所知-我们将部署第一个使用RAC的数据库,因此,看看效果如何)。 是否提供任何提供等效功能的SQL Server功能集(或您可以在其上安装的第三方组件)?我们一直使用Windows群集,在该群集中,故障转移事件会导致大约20-30秒的SQL停机时间-始终可以忍受,但并不理想。现在,借助SQL 2012中的AlwaysOn,SQL Server将其缩短到大约15秒,并增加了只读-辅助数据库的概念,但是它们仍然要求通过单个连接点阻塞写事务(由于许多事务都需要处理,因此大大改进了)只是阅读,但仍然不是真正的负载平衡),并且在节点故障或需要打补丁的情况下,仍然存在停机时间。 我想这只是出于好奇-我觉得这是SQL Server落后于Oracle的唯一领域(至少在我个人使用的功能中)。我想看看是否有任何选择可以弥补这一差距,并在我们等待添加Microsoft的等效功能时(也许在SQL 2014/2015中)改善我们自己的SQL Server部署?

2
从一个主作业顺序调用多个SQL Server Agent作业的好方法?
我有几个应顺序运行的SQL Server代理作业。为使应执行的作业保持良好的概览,我创建了一个主作业,该主作业通过调用来调用其他作业EXEC msdb.dbo.sp_start_job N'TEST1'。在sp_start_job瞬间完成(作业步骤1),但我想我的主要工作要等到工作TEST1已经调用下一个工作之前完成。 因此,我编写了这个小脚本,该脚本在作业被调用后立即开始执行(作业步骤2),并迫使主作业等待子作业完成: WHILE 1 = 1 BEGIN WAITFOR DELAY '00:05:00.000'; SELECT * INTO #jobs FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;', 'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'', @execution_status = 0, @job_aspect = N''JOB'''); IF NOT (EXISTS (SELECT top 1 * FROM #jobs)) BEGIN BREAK END; DROP TABLE #jobs; END; 这足够好用。但是我觉得WHILE 1 = …

5
在100mm记录上使用JOIN进行更新,如何做得更好?(在T-SQL中)
实际上,我需要更新单个表中的1亿条记录,通过用一个ID替换列的varchar值来规范化该表。(我说“替换”,但实际上我正在将ID写入另一列。) 我想要实现的是对数据集进行规范化。尚未规范化的数据没有索引。我的想法是,我不会在等待时在原始值上建立索引,而是在更新完成后索引将要用tinyint值替换varchar值的外键。 UPDATE A SET A.AutoClassID = B.AutoClassID FROM AutoDataImportStaging.dbo.Automobile as A JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName) 背景 在Server 2008 R2上使用MSSQL 2008 R2 服务器有8 GB RAM 服务器具有一个RAID10和7200 RPM SATA(我知道这不是很好,在生产中,它只能读取数据,而不能写入数据;加上最近的HD短缺使得这成为必需的成本) 服务器具有双四核Xeon CPU 机器没有做任何其他事情(当前专用于开发人员,仅此过程) 打开了简单的日志记录(?-但是它仍会记录下来以便可以回滚吗?) 请注意,该查询引用了两个不同的数据库,因此值得 表中要更新的记录的“宽度”为455字节 执行期间的资源 物理RAM已用完 磁盘I / O已用尽 CPU几乎什么也没做(扼要点是I / O) 运行时间已经有14个小时了! 我怀疑有些事情,例如我需要在原始数据上建立索引,即使在规范化更新后将删除列(AutoClassName)时也是如此。我还想知道是否应该一次循环遍历一个表而不是JOIN,这在我开始时似乎很荒谬,但现在看来它会更快。 如何为剩余的规范化更新(类似于此方法)更快地更改方法?


1
将FLOAT与RAISERROR一起使用
我一直RAISERROR()在提供一些基本的单元测试功能(如此处所示),但是对于无法FLOATs在错误消息中使用感到沮丧。我知道我可以将float转换为字符串,但是我RAISERROR在每个单元测试中都在使用,我不想为每个测试添加另一行代码。(我的单元测试已经足够罗word了!)是否可以在参数列表中执行内联转换/转换RAISERROR?还是有解决这种缺陷的另一种方法? 更新: 所以最终我希望我能做的是: RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm) 不幸的是,RAISERROR通常不处理%f或浮点数。所以我必须这样做: DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40)) RAISERROR('Unit Test FAILED! %s', 11, 0, @str) ...分散在数十个单元测试中时,看起来就像一团糟。因此,我想将其归结为以下内容: RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40)) 但这使我得到了Incorrect syntax near 'CAST'信息。我不明白为什么这是违法的,但是确实如此。我可以在这里使用另一个“衬板”吗?
11 sql-server  t-sql 

1
使用MoveFile API对SQL Server数据和日志文件进行碎片整理
我的雇主正在考虑部署使用Windows MoveFile API对打开的文件进行碎片整理的NTFS碎片整理软件。它将部署到运行2005-2012年的SQL版本以及2003和2008 R2的Windows版本的数千台SQL Server服务器中。如果重要的话,我正在谈论的产品是PerfectDisk,但我相信有类似的程序也可以以相同的方式工作。 除了偶尔的I / O性能问题外,到目前为止,测试还没有引发很多问题,这不足为奇,可以通过重新计划和调整碎片整理来解决。但是,我更担心数据损坏的风险。 这里有没有人有在数据库服务器上的生产环境中运行此类软件的经验?您是否遇到任何数据损坏? 尽管找不到任何确凿的证据表明存在问题,但我对此感到不安。 感谢您的任何答复。 编辑添加:幸运的是,这个可怕的想法被遗忘了,可能部分是由于我给出的一些警告。

1
为什么10 ^ 37/1会引发算术溢出错误?
继续我最近玩大量数字的趋势,我最近将错误归结为以下代码: DECLARE @big_number DECIMAL(38,0) = '1' + REPLICATE(0, 37); PRINT @big_number + 1; PRINT @big_number - 1; PRINT @big_number * 1; PRINT @big_number / 1; 我得到的这段代码的输出是: 10000000000000000000000000000000000001 9999999999999999999999999999999999999 10000000000000000000000000000000000000 Msg 8115, Level 16, State 2, Line 6 Arithmetic overflow error converting expression to data type numeric. 什么? 为什么前三个操作有效,但最后一个无效?如果@big_number可以明显地存储的输出,怎么会有算术溢出错误@big_number / 1?

2
将日期时间列转换为秒数
在我的SQL Server数据库中,有一datetime列。 创建代表long该datetime列值的新列的好方法是什么?在long将表示了若干秒。 我认为,如果可以将其转换为longs,则可以更轻松地按时间段进行分组查询,因为我可以将长整数除以固定数量。 该表是静态的,不会更新或删除数据。

2
作业类别中的任何作业失败时发出警报
是否可以在SQL Server 2008中设置警报,以便在特定类别的作业失败时将发送电子邮件? 我想知道是因为我想在SSRS订阅失败时设置一封电子邮件,并且所有这些订阅都是Report Server类别中的作业。 编辑 -事实证明,当SSRS订阅失败时,作业本身不会失败,因此我的问题将不适用于SSRS订阅监视。但是我仍然想知道我们在环境中运行的其他工作

2
有没有一种基于集合的方式来加载/读取带有HierarchyId的树枝
我正在玩HierarchyId,但还没有想出一种基于集合的方法来执行以下操作: 一次插入所有子树 一次检索所有子树 这个问题与我的上一个问题有关,我怀疑用HierarchyId完成这两项任务的唯一方法是一次一个节点或一个级别。如果我使用的是物化路径,则可以通过一个(且不重要的)基于集合的命令轻松地完成这两个动作。 我想念什么? 编辑:我也错过了一种移动子树的方法,但我从Mikael Eriksson的评论中学到了

5
SQL事件探查器会影响服务器性能吗?
我遇到了一个问题,其中sql server 2008因某些高负载而失败。我需要找到这种负载情况,并需要优化代码以使其能够处理负载。我在互联网上发现,SQL事件探查器可用于跟踪数据库交互,然后可以对其进行分析以找到问题发生的确切点。我还发现了如何启动sql profiler。但是现在我的问题是,通过启动sql profiler,我是否会影响服务器性能?

3
通过T-SQL以编程方式引用数据库
我正在编写一个存储过程,该过程使用数据库名称作为参数并返回该数据库的索引及其碎片级别的表。该存储过程将存在于我们的DBA数据库(该DB包含DBA用于监视和优化事物的表的数据库)中。如果有所不同,那么所讨论的系统都是SQL Server 2008 R2。 我已经解决了基本查询,但是一直试图提供索引的实际名称。据我所知,该信息包含在每个人的sys.indexes视图中。我的特定问题是尝试以编程方式从另一个数据库的存储过程中引用该视图。 为了说明这一点,这是有问题的查询的一部分: FROM sys.dm_db_index_physical_stats(@db_id,NULL,NULL,NULL,NULL) p INNER JOIN sys.indexes b ON p.[object_id] = b.[object_id] AND p.index_id = b.index_id AND b.index_id != 0 从@db_id标识的数据库执行查询时,查询工作正常,因为它使用了正确的sys.indexes视图。但是,如果我尝试从DBA数据库中调用它,则所有结果都将为null,因为sys.indexes视图用于错误的数据库。 一般而言,我需要能够执行以下操作: DECLARE @db_name NVARCHAR(255) = 'my_database'; SELECT * FROM @db_name + '.sys.indexes'; 要么 USE @db_name; 我尝试使用字符串连接和OBJECT_NAME / OBJECT_ID / DB_ID函数的组合切换数据库或引用其他数据库,但似乎没有任何效果。我会感激社区可能有的任何想法,但是怀疑我将不得不重新构建此存储过程以驻留在每个单独的数据库中。 在此先感谢您的任何建议。
11 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.