Questions tagged «sql-server»

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

3
更新WHERE子句以检查值是否不在单独的表中
我有一个使用WHERE子句的查询,并且碰巧在此表的许多查询中使用了完全相同的WHERE子句(等)。 查询是: SELECT DATENAME(DW, [AtDateTime]) AS [Day of Week] ,COUNT(*) AS [Number of Searches] ,CAST(CAST(COUNT(*) AS DECIMAL(10, 2)) / COUNT(DISTINCT CONVERT(DATE, [AtDateTime])) AS DECIMAL(10, 2)) AS [Average Searches per Day] ,SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END) AS [Number of Searches with no Results] ,CAST(CAST(SUM(CASE WHEN [NumFound] …

2
使用ADODB.SQL Server 2014的经典ASP连接(不带TLS 1.0)
由于以PCI合规性名义禁用了TLS 1.0,因此我无法使32位Classic ASP应用程序正常工作。 根据MS / Stack Exchange的建议,我已经安装了: SQL Server 2014 SP1 CU1 .NET Framework 4.6 这使我们的ASP.NET应用程序/ SSMS运行。但是我们使用ADODB.Connection对象的经典ASP应用程序无法正常工作。 我尝试了使用的连接字符串Provider=SQLNCLI11;,但这似乎也无济于事。共享内存提供程序仍在抱怨管道的另一端没有任何内容。错误信息: Microsoft SQL Server本机客户端11.0错误'80004005' 共享内存提供程序:管道的另一端没有进程。 我还尝试将命名管道与连接字符串一起使用,Provider=SQLNCLI11;Server=np:\\.\pipe\MSSQL$SQLEXPRESS\sql\query;Database=northwind;Trusted_Connection=Yes;并收到以下错误消息: Microsoft SQL Server本机客户端11.0错误'80004005' 命名管道提供者:管道的另一端没有进程。 我应该了解ADODB的补丁程序吗?我是否应该考虑以其他方式使用命名管道?(尽管对于TLS设置如何,为什么共享内存无法正常工作,我还是有些困惑) 评论更新: Web服务器和SQL Server在同一框中。 这是一个SQLExpress命名实例。启用TLS 1.0的连接字符串为: "Driver={SQL Server}; Server=.\SQLExpress; Database=northwind; Trusted_Connection=Yes; Integrated_Security=True;" 我也尝试过: "Provider=SQLNCLI11; Server=.\SQLExpress; Database=northwind; Trusted_Connection=Yes;" 禁用TLS 1.0后,两者均无效。我知道Trusted_Connection / Integrated_Security是多余的,但是弄乱这些似乎也无济于事。 我已切换了TCP和命名管道的启用,禁用和顺序。上面的连接字符串中使用的管道名称直接来自该实例的“服务器配置”。我还尝试禁用共享内存以确保命名管道正常运行。我还没有尝试过TCP(好像共享内存由于TLS而不能工作,为什么要使用TCP?)共享内存和命名管道都可以在启用TLS 1.0的情况下工作。一旦我翻转注册表项以禁用TLS …

1
带有条件的唯一标识符字段
我有一个不在生产中的数据库,所以主表是CustodyDetails,此表有一个ID int IDENTITY(1,1) PRIMARY KEY列,我正在寻找一种添加另一个在其他任何表中都未引用的唯一标识符的方法。帐户列的内容将不完全是一个身份密钥。 这个新的身份列中有一些具体细节,这就是我的问题所在。格式如下:XX/YY其中XX是一个自动递增的值,它将在每个新年度重置/重新启动,而YY是本年度的后两位SELECT RIGHT(YEAR(GETDATE()), 2)。 因此,例如,让我们假设从2015年12月28 日至03/01/2016结束的一天添加了一条记录,该列将如下所示: ID ID2 DATE_ADDED 1 1/15 2015-12-28 2 2/15 2015-12-29 3 3/15 2015-12-30 4 4/15 2015-12-31 5 1/16 2016-01-01 6 2/16 2016-01-02 7 3/16 2016-01-03 我想到了使用前端来解析组合ID(示例中为ID2)以获取最后2位数字并与当年的最后2位数字进行比较,然后决定是否启动新的相关项。当然,能够在数据库端完成所有操作将是宏伟的。 编辑1:顺便说一句,我也看到人们使用单独的表只是为了存储并行的身份密钥,所以一个表的身份密钥成为第二个表的辅助密钥,这听起来有点狡猾,但也许是这样的实现到位的情况? 编辑2:此额外的 ID是旧文档参考,标记每个文件/记录。我猜想它可能是主ID的特殊别名。 在过去的20年中,该数据库每年处理的记录数没有超过100,并且极有可能(确实非常高),当然,如果超过99,该字段将能够继续使用多余的数字,前端/过程将能够超过99,因此它不会改变它。 当然,我一开始没有提到这些细节,因为它们只会缩小解决方案的可能性,以满足我的特定需求,并试图将问题范围扩大。

2
透明数据加密
在SQL Server 2008中配置TDE时是否有最佳实践?在SQLMag上,文章“透明数据加密常见问题解答”说,CPU使用率可能增加了30%? 除了增加服务器功能之外,打开TDE时,DBA通常还会执行其他操作吗?

1
是否可以在没有备用文件的情况下从待机/只读状态恢复SQL数据库?
如果缺少“备用文件”,有什么方法可以从备用/只读模式恢复SQL数据库? (在日志传送方案中,我看到一些引用将其称为TUF文件,但就我而言,这只是手动还原,备用文件具有BAK扩展名。) 进行“ RESTORE DATABASE foo WITH RECOVERY”会导致致命错误: During startup of warm standby database 'foo', its standby file ('path\filename.bak') was inaccessible to the RESTORE statement. The operating system error was '5(Access is denied.)'. Diagnose the operating system error, correct the problem, and retry startup. 恢复是在前一段时间完成的,不幸的是,备用文件位于备份文件夹中,并被我们的文件夹清理例程删除。该文件的副本在任何其他媒体上均不存在。还原到这一点的原始备份也早已消失。 幸运的是,这对我们来说不是什么大问题(这是临时还原),但是除了“不删除该文件”之外,我找不到关于此问题的其他有用参考。 如果涉及到它,我想我可以编写整个数据库的脚本,或者使用SSIS将所有对象复制到一个新的数据库容器中,因为我前面有数据库的只读副本。 有什么办法解决这个问题?我当然不希望自己能够将其翻转回“还原”状态并继续执行后续的还原操作或其他任何操作,我只是想将其强制为当前状态的正常在线模式,这样我才能例如更改权限,更改恢复模式或进行新的完整备份等。

2
SQL Server见证的版本重要吗?
可以在镜像安装程序中使用比镜像更高的SQL Server版本的SQL Server见证程序吗? 就是 镜像位于SQL Server 2012 Standard上,见证服务器使用SQL Server 2014 Express。

1
下一版本的SQL Server的计划发布日期[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 Microsoft是否发布了下一版本的路线图,以标识计划的发布日期? 如果没有,您认为下一个版本可以投入生产多久?

3
调整具有多个联接的查询
我有这个查询.. 214执行/分钟,平均44.42 CPU(ms)有没有办法使它更快 SELECT P.Id id0, P.ProgramId ProgramId1, P.ProgramName ProgramName2, P.ProgramLevel ProgramLevel3, P.Department Department4, P.Track Track5, P.AcademicYear AcademicYear6, P.StartTerm StartTerm7, P.Delivery Delivery8, P.Fee Fee9, P.City City10, P.STATE State11, P.StartDate StartDate12, P.Deadline Deadline13, P.DeadlineDisplay DeadlineDisplay14, P.ProgramType ProgramType15, O.Id as OrganizationId16, O.NAME OrganizationName17, P.ApplicationType ApplicationType18, P.Concentration Concentration19, P.ZipCode ZipCode20, P.Campus Campus21, P.WADisplayName …

2
将数据库移至新数据中心
我的公司正在将基础架构移至新的数据中心,我正在尝试找出使新服务器上的数据库与当前生产数据库保持同步的最佳方法,直到新环境准备就绪。我不是一名全职的DBA,而是进行了一些研究,从阅读的内容来看,跨国复制设置似乎可以最好地满足我们的需求。 一些细节:生产数据库的大小约为90 GB,使用Robocopy大约需要9个小时才能将其副本移至新服务器中。当前的生产数据库将需要保持联机状态,并且在整个迁移过程中都可以访问。它的恢复很简单,因此数据库镜像不可用。 事务复制是保持数据库同步的最佳方法吗? 我的计划: (完成)传输当前数据库并登录到新服务器,并将其附加到SQL Server的新实例 在我们的开发数据库计算机上设置分发服务器,然后从生产数据库中发布该分发服务器 在新的数据库计算机上创建一个订户,该订户将每晚每晚接受一次从分发服务器推出的更新 我有两件事。事务复制要求每个发布的表都有一个主键,生产数据库中的许多表都没有定义主键。我认为这不会成为太大的问题,因为我主要关心的只是同步数据库。我们将在以后的数据中测试使用数据库的不同应用程序,但我想确保它不是一个严重的问题。其次,是否还需要从原始实例(例如master)中移出任何关联的系统DB?我们将在新环境中迁移到Active Directory设置,因此我不在乎用户等,但是我不确定系统DB的必要性。 总体而言,我是否正确理解了这些概念?

2
如何获得像SSMS这样的单个行数?
我有一个客户端c#程序,正在通过执行存储过程ExectueNonQuery,包括PRINT使用InfoMessage事件捕获和错误输出。它工作正常,但我注意到有些奇怪。 当我从SSMS执行存储过程时,它将显示在“消息”选项卡中执行的每个单独的SQL语句的行数(就像它来自InfoMessages)。尽管我的程序确实捕获了所有其他相同的输出,但是我的程序从未看到这些消息。相反,它仅返回ExecuteNonQuery函数结果中受影响的行,该行是所有单个行计数之和(这是无用的)。 例如,此过程: use [tempdb] go SELECT * INTO MyCols FROM sys.columns go CREATE PROC foo As UPDATE MyCols SET name = name + N'' -- SSMS shows (662 row(s) affected) UPDATE MyCols SET name = name + N'' WHERE name like '%x%' -- SSMS shows (59 row(s) affected) PRINT …

2
我可以在多个磁盘上进行完整备份吗?
目前,我只有一个备份文件IMTDB.bak,它与数据库本身在同一HDD上。我想通过本质上将其“复制”到另一个磁盘来增加此数据库备份的冗余,但是出现错误“服务器备份失败,该介质被格式化为支持2个介质系列”。我认为这意味着在创建备份时,仅意味着将备份放在一个驱动器上,而我无法追溯地添加更多。我想将备份迁移到该其他驱动器(实际上只是将其复制过来),但是我不想删除当前备份来执行此操作。 我该怎么办?我仅将IMTDB.bak复制到另一个驱动器上的文件夹中是否安全?

6
索引重建时间是否取决于碎片级别?
重建索引所需的时间是否取决于碎片级别? 如果重建相同索引的40%碎片索引需要1分钟,重建80%碎片索引大约需要2分钟吗? 我要求的是执行所需操作所需的RUNTIME(例如,以秒为单位),而不是关于在特定情况下需要执行哪些操作。我知道应该进行索引重组或重建/统计更新时的基本最佳实践。 这个问题不问关于REORG以及REORG和REBUILD之间的区别。 背景:由于设置了不同的索引维护作业(每个晚上,周末工作量较大……),我想知道是否应该对低中级零散的索引更好地执行每日“轻度”离线索引维护作业,以保持关闭时间很小-甚至没有关系,在80%碎片索引上进行重建可能需要与在40%碎片索引上进行相同操作的时间相同。 我遵循了建议,并试图找出自己正在发生的事情。我的实验设置:在没有其他操作且未被任何人或其他任何人使用的测试服务器上,我在uniqueidentifier主键列上创建了带有聚簇索引的表,其中包含一些其他列和不同的数据类型[2数字,9日期时间和2 varchar(1000)]并简单地添加行。对于提出的测试,我增加了约305,000行。 然后,我使用了一条更新命令,并随机更新了对整数值进行过滤的行范围,并使用变化的字符串值更改了VarChar列之一以创建碎片。之后,我检查中的当前avg_fragmentation_in_percent水平sys.dm_db_index_physical_stats。每当为基准创建“新”碎片时,都会将此值(包括该physical_page_count值)添加到下图所组成的录音中。 然后我跑了出来:Alter index ... Rebuild with (online=on); 并CPU time通过STATISTICS TIME ON录音来抓取。 我的期望:我期望至少看到一种线性曲线的指示,该线性曲线显示碎片水平和cpu时间之间的依赖关系。 不是这种情况。我不确定此程序是否真的适合取得良好效果。也许行数/页面数太少? 但是结果表明,我最初的问题的答案肯定是“ 否”。看起来SQL Server重建索引所需的cpu时间既不依赖于碎片级别,也不依赖于基础索引的页数。 第一张图表显示了与先前的碎片级别相比,重建索引所需的cpu时间。如您所见,平均线是相对恒定的,碎片与所需的cpu时间之间根本没有关系。 为了尊重更新后索引页数变化可能会影响重建的时间的影响,我计算了FRAGMENTATION LEVEL * PAGES COUNT并在第二张图表中使用了该值,该图表显示了所需cpu时间的关系以及碎片和页数。 如您所见,即使页面数有所变化,这也并不表示重建所需的时间受碎片影响。 在做出这些陈述之后,我想我的程序一定是错误的,因为重建一个庞大且高度分散的索引所需的cpu时间可能仅受行数的影响-我并不真正相信这一理论。 因此,因为我确实非常想立即发现这一点,所以欢迎任何进一步的评论和建议。

5
使用动态SQL在数据库之间切换
我有一个涉及在多个数据库之间执行各种命令的过程-但是,当我使用动态SQL通过“ use @var”更改数据库时,它实际上并没有更改数据库。 在[test_db]中执行此操作: declare @currentDB varchar(max) declare @sql varchar(max) set @currentDB = DB_NAME() set @sql = 'use [' + @currentDB +']' use master exec(@sql) select DB_NAME() 返回[Master]作为当前数据库名称-如果我将其use [test_db]作为命令而不是动态输入,则它将返回正确的名称。 有没有一种方法可以在数据库之间正确切换?

1
防止在不合格的索引视图上聚集索引插入运算符
有谁知道解决方法?从本质上讲,即使行不符合条件,存储过程也会强制对索引视图执行插入操作。结果,存在转换错误。但是,对于临时而言,sql可以正确地消除视图的考虑。 考虑以下架构: create table testdata ( testid int identity(1,1) primary key , kind varchar(50) , data nvarchar(4000)) go create view integer_testdata with schemabinding as select cast(a.data as int) data, a.kind, a.testid from dbo.testdata a where a.kind = 'integer' go create unique clustered index cl_intdata on integer_testdata(data) go create procedure insert_testdata …

2
数据库引擎被盗的服务器内存过高
我从系统中心运营经理(SCOM)得到错误。 如何解决这个错误? SQL DB 2012引擎被盗服务器内存太高。 我运行查询并获得以下计数器: ╔═══════════════════════════════╦═════════════╗ ║ Stolen Server Memory (MB) ║ 7354.773437 ║ ║ Lock Memory (MB) ║ 106.195312 ║ ║ Free Memory (MB) ║ 64.632812 ║ ║ Connection Memory (MB) ║ 24.203125 ║ ║ Log Pool Memory (MB) ║ 14.085937 ║ ║ Optimizer Memory (MB) ║ 2.351562 …

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.