Questions tagged «sql-server»

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

5
如何限制一个人一次可以运行的SQL存储过程?
我有一个存储过程,基本上从一个表中选择值,然后将它们插入到另一个表中,这是一种归档。我想避免多个人同时执行此操作。 在运行此过程时,我不希望其他任何人都可以启动该过程,但是我不希望序列化,而在完成后,其他人可以运行该过程。 我想要的是给其他尝试启动该程序的人,同时我正在运行该程序。 我已经尝试过使用sp_getapplock,但是我无法完全阻止该人运行该过程。 我还尝试使用sys.dm_exec_requests查找该过程并阻止该过程,尽管这确实可行,但我认为它不是最佳选择,因为在某些服务器上我没有运行sys.dm_exec_sql_text(sql_handle)的权限。 我这样做的最佳方法是什么?

1
备份检测到损坏,但是CHECKDB没有
我有一个数据库,在其中运行备份命令 BACKUP DATABASE [MyDatabase] TO DISK = 'G:\Backup\MyDatabase_01_01_2018.bak' WITH NOFORMAT, NOSKIP, COMPRESSION, INIT, BUFFERCOUNT = 100 我收到错误消息 消息3043,级别16,状态1,第8行 BACKUP'MyDatabase'在文件'F:\ Data \ MyDatabase_1.ndf'中的页面(1:745345)中检测到错误。 消息3013,级别16,状态1,第8行 BACKUP DATABASE异常终止。 我运行了一个完整的CHECKDB,但恢复正常。我确实注意到页面验证选项已设置为NONE(不是我的工作),所以我将其更改为CHECKSUM并重建了数据库中的所有索引,使其可以写入所有页面并生成校验和。此后,备份仍然失败,并且checkdb仍显示为干净(因此无更改)。 DBCC CHECKDB('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY, EXTENDED_LOGICAL_CHECKS; 从SQL日志中: 由xxx执行的具有all_errormsgs,no_infomsgs和data_purity的DBCC CHECKDB(MyDatabase)发现0个错误,并修复了0个错误。经过时间:0小时21分46秒。内部数据库快照的拆分点LSN = 000ab776:0000112f:0001和第一个LSN = 000ab776:0000112d:0001。 我运行了DBCC PAGE,但是它出错了(起初似乎都没有返回正确的页面)。我可以使用打印选项2运行它,但它会返回,但说实话我不知道我在那儿寻找什么。 DBCC PAGE ('MyDatabase',1,745345,3) 页面:(3:513793) 缓冲: BUF @ 0x00000003811F8280 …

4
MS-SQL上是否有任何(隐藏的)内置函数来取消引用对象名称?
有时,我在某些数据库中存储对象名称(标识符),例如在某些参数表中。因为我使用'='或'LIKE'比较运算符从这些表中选择记录,所以我必须注意始终使用括号将这些名称存储起来。 IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = '[TABLE_NAME]'; 要么 IF EXISTS (SELECT 1 FROM MYTABLE WHERE OBJ_NAME = 'TABLE_NAME'; 但是,MS-SQL具有一些函数,您可以在其中使用带括号或不带括号的对象名称,例如OBJECT_ID()函数。我在dbfiddle.uk上建立了一个最小的示例。 CREATE TABLE TEST ( ID INT IDENTITY(1,1) PRIMARY KEY, OBJECT sysname NOT NULL ); GO INSERT INTO TEST VALUES ('[obj1]'),('obj2'),('obj3'),('[obj4]'); GO 现在,我可以使用OBJECT_ID()来检查表TEST是否以这种方式存在: IF OBJECT_ID('TEST') IS NOT NULL …
12 sql-server  t-sql 

1
查询存储强制计划功能不起作用
查询存储强制计划功能似乎没有执行该计划。 我知道查询存储-强制并不总是意味着强制;但是,我的计划可能不会发生重大变化,但是查询优化器可能会继续选择错误的索引,循环选择等。 基本上:它不符合我的强制计划选择。我强迫了许多计划,但没用。 当我查看时,有0个失败计数或原因sys.query_store_plan force_failure_count。 扩展事件query_store_plan_forcing_failed不会产生任何结果。0活动。 例如,一个计划在20.09开始实施。只有1次编译碰巧使用了强制计划。 这些计划大相径庭,一个计划与INDEX 1一起使用哈希匹配联接,另一个计划与INDEX 2一起使用循环联接。 版本:Microsoft SQL Server 2016(SP1-GDR)(KB3210089)-13.0.4202.2(X64) 我在这里想念什么?



3
有没有办法对WHERE子句中的变量进行空检查仅发生一次?
我对一个看起来像这样的大表进行查询: declare @myIdParam int = 1 select * from myTable where (@myIdParam is null or myTable.Id = @myIdParam) 在where子句中有几个类似的条件,并且也有很多联接,但这是一个摘要。 实际上,如果@myIdParam为null,则我们不想使用此参数来限制结果。 我不是数据库专家,但是从我的测试看来,此NULL检查是针对每条记录执行的,并且没有以任何方式进行优化。 如果我删除了空检查并假定参数不为空,则查询将立即返回。否则,最多需要十秒钟。 有没有一种方法可以对此进行优化,以便在运行时仅进行一次检查?
12 sql-server  null 

2
存储过程中的事务
我需要在单个事务中执行UPDATE和INSERT。该代码本身可以正常工作,但是我希望能够轻松地调用它并传递所需的参数。当我尝试将此事务嵌套在存储过程中时,我遇到许多语法错误。 如何封装以下代码,以便可以轻松调用它? BEGIN TRANSACTION AssignUserToTicket GO DECLARE @updateAuthor varchar(100) DECLARE @assignedUser varchar(100) DECLARE @ticketID bigint SET @updateAuthor = 'user1' SET @assignedUser = 'user2' SET @ticketID = 123456 UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID); INSERT INTO [dbo].[tblTicketUpdate] ([ticketID] ,[updateDetail] ,[updateDateTime] ,[userSamAccountName] ,[activity]) VALUES (@ticketID, 'Assigned ticket to …

3
可用性组数据库卡在“不同步/恢复挂起”模式下
在SQL Server 2014 SP1(12.0.4422.0)实例中升级存储时,我们遇到了以下问题:重新启动SQL Server后,其中两个数据库无法在辅助数据库上启动。在我们安装新的(更大)SSD并将数据文件复制到新卷中时,服务器已脱机几个小时。当我们重新启动SQL Server时,除两个数据库外,所有其他数据库再次开始同步。另外两个在SSMS中显示为“ 未同步/正在等待恢复”。 之前有类似的“ 不同步/恢复中”问题,我检查了“可用性组”->“可用性数据库”部分下的状态,但是它们显示为红色X: 甚至试图暂停数据移动都会产生错误消息: 无法挂起数据库“ StackExchange.Bycycles.Meta”中的数据移动,该数据库位于可用性组“ SENetwork_AG”中的可用性副本“ ny-sql03”上。(Microsoft.SqlServer.Smo) 附加信息:执行Transact-SQL语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo) 由于文件不可访问或内存或磁盘空间不足,无法打开数据库“ StackExchange.Bycycles.Meta”。有关详细信息,请参见SQL Server错误日志。(Microsoft Sql Server,错误:945) 我检查了文件是否存在,没有任何权限问题。我还检查了管理下SSMS中的SQL Server日志,但是没有看到有关挂起恢复或两个数据库有任何问题的信息。 在寻求帮助的过程中,我找到了两篇不同的文章,说需要还原数据库。 当数据库卡在恢复挂起中时,是否有任何方法可以在辅助数据库上恢复数据复制?

4
处理源LOB列时避免使用“逐行”获取方法
我有一个旧的PostgreSQL数据库源(ODBC),我正尝试使用SSIS迁移到新的SQL Server模式。我收到警告说: 强制执行“逐行”读取方法,因为该表具有LOB列。列的内容是LOB 问题是,该列中的任何一个都不必真正是LOB。有一些是TEXT类型,但可以很容易地放入varchar(max)中。但是,甚至更陌生的人,大多数已经是 varchars,但是似乎将varchar(128)上的所有内容都视为是LOB(在预先的属性中,数据类型为DT_NTEXT)。 我事件尝试执行一条手动SQL命令,其中我在select语句中将每种字符串类型显式转换为适当长度的varchar,并且在ODBC源中仍将它们设置为DT_NTEXT。 我不是DBA,所以我做的事情很愚蠢是完全有可能的。我只想知道确保类型最终成为varchars的最佳方法,这样我就可以批量提取。有任何想法吗? 如果有问题,我将在Visual Studio 2013中使用SSIS-BI 2014。



2
为什么索引视图不允许非唯一聚集索引?
我一直在研究使用索引视图来提高一些我们最常用的视图的性能。 但是,索引视图不支持非唯一的聚集索引,这与其余数据库结构设置的优先级略有不同。 例如,这是几个表的简化版本。 -Groups- Group ID GroupName -Users- UserKey UserName FullName GroupID 索引位于Groups.GroupID(非群集)和Users.GroupID(群集)上。聚簇键位于“用户”表中的GroupID上,因为通常会检索到来自特定组的一系列用户。显然,每个组将有多个用户,因此该聚集索引是唯一的。 这使我不确定如何在索引我的视图(例如本示例)时遵循此优先顺序,因为我无法拥有非唯一的聚集索引。 ConsumableID ConsumableVariantID AllowThresholdOverwrite FullPath GroupID ManufacturerID Type ModelID 101 29 1 0.1.2.4. 4 3 3 2 实际上,此View上唯一唯一的值是ConsumableID列,因此在将索引放置到什么地方时,我别无选择。 为什么在常规表允许时View不允许非唯一聚集索引?

3
“数据库正在转换”错误
今天,我正在尝试通过现有数据库还原数据库,我只是在SSMS中右键单击该数据库->任务->脱机,以便可以还原该数据库。 一个小弹出窗口出现并显示Query Executing.....了一段时间,然后抛出了一个错误说Database is in use cannot take it offline。我从中收集到该数据库的一些活动连接,因此我尝试执行以下查询 USE master GO ALTER DATABASE My_DatabaseName SET OFFLINE WITH ROLLBACK IMMEDIATE GO SSMS此时再次显示Query Executing.....一段时间,然后引发以下错误: Msg 5061, Level 16, State 1, Line 1 ALTER DATABASE failed because a lock could not be placed on database 'My_DatabaseName'. Try again later. Msg 5069, …

1
在Powershell中从SSMS检索打印的消息
我们的DBA团队不会使用以下方法来验证备份TSQL(可以轻松地在备份后完成备份,几乎不需要时间,因此我不知道为什么不这样做): RESTORE VERIFYONLY FROM DISK = 'D:\Backups\LOCATION' 他们过去曾遇到过问题,因此即使我们认为他们会从中学到东西,也没有。我创建了一个Powershell脚本来执行此操作,因为我们有大约100多个服务器,我只想针对所有备份运行此脚本,以确保它们有效。下面的脚本可以正确运行(因为它不会中断或抛出错误),我很好奇是否有一种方法可以将返回的消息返回到Powershell中,而我们通常会在SSMS中得到该消息,其中指出文件1上的备份集为作为验证有效。 $SqlCon = New-Object System.Data.SqlClient.SqlConnection $SqlCon.ConnectionString = "SERVER=SERV\INST;Integrated Security=true;DATABASE=master" $baks = Get-ChildItem "D:\Backups\" -Filter *.BAK foreach ($bak in $baks) { $SqlCon.Open() $cd = New-Object System.Data.SqlClient.SqlCommand $cd.Connection = $SqlCon $cd.CommandText = "RESTORE VERIFYONLY FROM DISK = @f" $cd.Parameters.Add("@f", $bak.FullName) $cd.ExecuteNonQuery() $SqlCon.Close() }

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.