Questions tagged «sql-server»

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

1
将旧数据设为只读
在我当前正在从事的数据库项目中,要求在某个时间点将“旧”数据更改为只读。在SQL Server中可以吗? 我不能更改表许可权,因为只读许可权应仅适用于早于特定阈值的数据,即用户仍应能够添加和编辑在此时间点之后添加的数据。
11 sql-server 


1
作业未按计划运行
因此,我有一个基本的SQL代理作业,该作业运行Robocopy脚本将所有文件从一个文件夹移动到另一个文件夹。 Job是一个非常基本的设置。 有相当基本的时间表。 但它尚未运行。我不是说成功跑步,也不是说完全跑步。有什么可能的原因吗? 有关其他信息,我还将对工作进行脚本编制。 USE [msdb] GO /****** Object: Job [MoveMantisFilesToArchive] Script Date: 12/23/2015 10:21:52 AM ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 12/23/2015 10:21:52 AM ******/ IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) …

2
SQL Server中的索引视图
我有一张桌子和它的索引视图 Create table mytable1 (ID int identity(1,1), Name nvarchar(100)) Create table mytable2 (ID int identity(1,1), Name nvarchar(100)) Create view myview with schemabinding as select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id 现在,如果我运行以下查询 select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id …

2
联机时将SQL Server数据库移动到新磁盘
我有一个1.4TB的SQL Server数据库,它在磁盘I / O方面大为挣扎。我们已经在服务器中安装了一个新的SSD阵列,可以解决所有问题,我们只是在讨论跨数据库移动的最佳方法。理想情况下,如果我们可以在不停机的情况下做到这一点,那是最好的。但是,如果在性能不佳的两天(例如,复制数据时)与停机两个小时之间进行选择,则后者是可取的。 到目前为止,我们提出的解决方案是: 简单复制。使数据库脱机,复制文件,更改SQL Server中的位置,然后使其重新联机。粗略的数字估计这将花费最多五个小时,这虽然确实不能接受,但这是最简单的解决方案。 块级副本。使用类似rsync的实用程序,我们在数据库启动时在后台复制文件。准备迁移时,我们使数据库脱机,使用此实用程序进行差异复制,然后将SQL Server指向新文件并使它联机。这里的时间未知。我们不知道对1.4TB进行差异分析并将其复制到多长时间。我们的另一个担心是,块级副本将使文件处于SQL Server无法读取的某种状态,这将浪费我们的时间。 SQL迁移。在新磁盘上创建一个新的1.4TB SQL数据文件,并在所有其他文件上禁用自动增长。然后依次对所有其他数据文件运行DBBC SHRINKFILE(-file_name-,EMPTYFILE)。一旦所有数据都经过处理,我将在某个时间点使用计划的窗口将MDF文件移至SSD并删除其他未使用的文件。我之所以这样,是因为它最大程度地减少了停机时间。但是我不知道这将花费多长时间,并且在发生时是否会导致性能下降。 我们没有任何负载和性能环境可以对此进行测试。我可以验证这些策略是否可以在我们的登台环境中使用,但不能影响效果,而不能用于性能。
11 sql-server  ssd 

2
DATALENGTH的总和与sys.allocation_units中的表大小不匹配
我的印象是,如果我将DATALENGTH()一个表中所有记录的所有字段的总和求和,我将得出该表的总大小。我错了吗? SELECT SUM(DATALENGTH(Field1)) + SUM(DATALENGTH(Field2)) + SUM(DATALENGTH(Field3)) TotalSizeInBytes FROM SomeTable WHERE X, Y, and Z are true 我在下面使用此查询(我从网上获得此查询来获取表大小,仅聚集索引,因此它不包含NC索引)来获取数据库中特定表的大小。出于计费目的(我们按部门使用的空间量向部门收取费用),我需要找出此表中每个部门使用的空间。我有一个查询,用于标识表中的每个组。我只需要弄清楚每个小组要占用多少空间。 由于VARCHAR(MAX)表中的字段,每行空间可能会波动很大,因此我不能只取平均大小*部门的行数比率。当我使用上述DATALENGTH()方法时,我只能获得下面查询中使用的总空间的85%。有什么想法吗? SELECT s.Name AS SchemaName, t.NAME AS TableName, p.rows AS RowCounts, (SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, (SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, ((SUM(a.total_pages) - SUM(a.used_pages)) * 8)/1024 AS UnusedSpaceMB FROM sys.tables t with …

1
在非常繁忙的表上创建索引
我们有一个insert\select每次都有很多表的表(例如每秒有100台计算机插入\更新)。 在即使一秒钟都无法锁定的表上创建索引的最佳方法是什么? 如果创建索引,我确定它会锁定请求,而我做不到。 这是一张有100万行以上的大表。

1
SQL Server中的“在检查点上截断日志”选项
长话短说,但我们的长期顾问(前雇员)早在2006年左右就编写了一个自定义脚本来与Tivoli Storage Manager交互,并且似乎正在检查名为的SQL Server DB选项truncate log on checkpoint。他们的说法是,它阻止脚本在SQL 2012实例上运行和执行备份。 我觉得这是完整的BS,因为我找不到任何这样的选项,sp_configure并且备份在一个实例之外的任何地方都可以工作。但是,我想删除一个地雷(如果确实如此),并删除其他过时的元素。我确实让他们与供应商核实,但我对他们所说的话没有高度的信心。 我所做的研究只返回了SQL 2000或Sybase选项。另一个说法是,当恢复模型使用SIMPLE并且没有明确的选项打开或关闭它时,它在更高版本(2008及更高版本)中被隐式调用/使用。 由于该TRUNCATE LOG命令由于这些天的事务日志的工作方式已过时,因此我认为这不是一个可以查询的选项。 由于我没有任何SQL Server 2000实例,因此我希望有人可以回忆起此事,或者可以检查周围放置的实例。我告诉他们,我没有什么可以推荐的。我也希望有人可以确认这已经过时了。

5
为什么此UPDATE会因唯一的键约束冲突而失败?
我是一个“偶然的” DBA,相对缺乏经验并且对此问题感到困惑。 运行MS SQL Server2012。问题在于此UPDATE语句: UPDATE dbo.tAccts SET Ticket = 'ARP.ExGE' , Method = 'smtp' , AcctOwner = 'r00417819' , DisplayName = '~AppLight HBSFax-Inactive' , Destination = 'r00417819@mail.ad.ge.com' , UpdatedBy = SYSTEM_USER , UpdatedOn = CAST(GetDate() AS DATE) FROM dbo.vReclaimable WHERE OHR_EmpStatus <> 'A' 哪个应该只更新vReclaimable视图返回的tAccts表中的行。 vReclaimable视图基于tAccts表,并返回tAccts中的行的子集。 当我运行它时,它会失败并出现一个唯一的关键错误: (0 row(s) affected) …

4
修改XML:将属性转换为元素
我有一XML列包含具有相似结构的数据: <Root> <Elements> <Element Code="1" Value="aaa"></Element> <Element Code="2" Value="bbb"></Element> <Element Code="3" Value="ccc"></Element> </Elements> </Root> 如何使用SQL Server修改数据以将每个Value属性更改为一个元素? <Root> <Elements> <Element Code="1"> <Value>aaa</Value> </Element> <Element Code="2"> <Value>bbb</Value> </Element> <Element Code="3"> <Value>ccc</Value> </Element> </Elements> </Root> 更新: 我的XML看起来更像这样: <Root attr1="val1" attr2="val2"> <Elements> <Element Code="1" Value="aaa" ExtraData="extra" /> <Element Code="2" Value="bbb" ExtraData="extra" /> <Element Code="3" …
11 sql-server  xml  xquery 

2
找不到正在创建备份的进程
我们在客户服务器上安装了SQL Server 2008实例。客户的IT部门负责计算机的各种备份。 SQL Server日志显示每天晚上7点有完整备份,但是我们找不到SQL Server中计划的任何计划的证据。 我们联系的技术人员无法告诉我们是否存在某种自动备份,他们所知道的只是整个计算机都在备份。 使用在该论坛线程中找到的脚本,我发现物理设备名称是GUID,这意味着这是一个外部备份过程: USE [msdb] GO SELECT [bs].[database_name], [bs].[backup_start_date], [bs].[backup_finish_date], [bs].Server_name, [bs].user_name AS [BackupCreator] , [bmf].physical_device_name FROM msdb..backupset bs INNER JOIN msdb..backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] ORDER BY [bs].[backup_start_date] DESC 这是上面查询的一行: db_name 2015-09-16 19:01:23.000 2015-09-16 19:01:28.000 SERVER_NAME NT AUTHORITY \ SYSTEM {424F084A-F35D-4A66-8FC7-072268A89A77} 5 此外,备份的开始和结束日期仅持续5秒钟,因此我想很明显这不是SQL …

1
在while循环中是否需要显式事务?
SQL Server 2014: 我们有一个非常大的表(一亿行),我们需要在表上更新几个字段。 对于日志传送等,显然,我们也希望将其保持在很小的规模上。 如果让下面的代码运行一段时间,然后取消/终止查询,那么到目前为止已完成的工作将全部提交吗,还是我们需要添加显式的BEGIN TRANSACTION / END TRANSACTION语句以便我们可以随时取消? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' …

2
无法镜像数据库SQL Server 2012
尝试使用以下命令镜像数据库时 ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ 我收到以下错误 消息1475,级别16,状态105,行1 数据库“ test0916aj8CJ”可能包含尚未备份的大容量记录更改。在主体数据库或主数据库上进行日志备份。然后在镜像数据库上启用数据库备份以恢复备份,或者在每个辅助数据库上还原该备份以将其加入可用性组。 可以不备份数据库就可以做到吗?还是应该备份然后放弃备份。它用于新创建的数据库,因此无论如何我现在都不需要备份。 我尝试了以下方法... BACKUP DATABASE [test0916aj8CJ] TO DISK = N’NUL’ WITH COPY_ONLY, NOFORMAT, INIT, NAME = N’test-Full Database Backup’, SKIP, NOREWIND, NOUNLOAD GO 但是上述方法也不起作用。 谢谢

1
为什么不支持删除列上的Identity属性
我读过,在SQL Server 2000之后,删除了“取消身份”身份列的功能。而且这是“通过设计”(不仅仅是缺少的功能)。 这是我在博客上找到的示例。它涉及更新系统表。(并且该功能在SQL Server 2000之后被删除。)我知道通过系统表执行此操作不是一个好主意。我只是想知道为什么没有其他功能可以做到这一点。 解决此问题将使我付出大量工作。(在无法停机的环境中将数亿行复制到新表中。) 所以我想问“为什么”。 Sql Server 2005和更高版本中发生了什么更改,这使这件事变得不好了?还是总是不好,只是没有被锁定? 将身份列再次设为普通列会违反什么“最佳实践”(或类似原则)? - 更新以回答“为什么要这样做”的请求: 这是一个非常高级的摘要:我将开始向表中添加分区。(这样我就可以存档/清除旧数据。)这很容易。但是我有时需要将记录移到另一个分区,以免被删除(当一个分区用于归档/删除时)。(我的分区列增加了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.