Questions tagged «sql-server»

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

4
根据另一列重置运行总计
我正在尝试计算运行总计。但是,当累积总和大于另一个列的值时,应该重置 create table #reset_runn_total ( id int identity(1,1), val int, reset_val int, grp int ) insert into #reset_runn_total values (1,10,1), (8,12,1),(6,14,1),(5,10,1),(6,13,1),(3,11,1),(9,8,1),(10,12,1) SELECT Row_number()OVER(partition BY grp ORDER BY id)AS rn,* INTO #test FROM #reset_runn_total 索引详细信息: CREATE UNIQUE CLUSTERED INDEX ix_load_reset_runn_total ON #test(rn, grp) 样本数据 +----+-----+-----------+-----+ | id | val | reset_val …

1
使用COALESCE将主键从IDENTITY更改为持久计算列
为了使应用程序与整体数据库脱钩,我们尝试将各种表的INT IDENTITY列更改为使用COALESCE的PERSISTED计算列。基本上,我们需要分离的应用程序能够为许多应用程序之间共享的通用数据更新数据库,同时仍允许现有应用程序在这些表中创建数据而无需修改代码或过程。 因此,从本质上讲,我们已经脱离了的列定义; PkId INT IDENTITY(1,1) PRIMARY KEY 至; PkId AS AS COALESCE(old_id, external_id, new_id) PERSISTED NOT NULL, old_id INT NULL, -- Values here are from existing records of PkId before table change external_id INT NULL, new_id INT IDENTITY(2000000,1) NOT NULL 在所有情况下,PkId也是主键,在除一种情况以外的所有情况下,它都是聚集的。所有表都具有与以前相同的外键和索引。本质上,新格式允许由解耦的应用程序提供PkId(作为external_id),但也允许PkId作为IDENTITY列值,因此允许通过使用SCOPE_IDENTITY和@@ IDENTITY依赖于IDENTITY列的现有代码照常工作。 我们遇到的问题是,我们遇到了一些查询,这些查询过​​去可以在可接受的时间内运行,现在已经完全崩溃了。这些查询使用的生成查询计划与以前不同。 鉴于新列是PRIMARY KEY,数据类型与以前相同,并且为PERSISTED,因此我希望查询和查询计划的行为与之前相同。就SQL Server如何生成执行计划而言,COMPUTED PERSISTED INT PkId是否应在本质上与显式INT定义具有相同的行为?您还可以看到这种方法还有其他可能的问题吗? …

3
指定的网络名称不再可用
我们有一个访问数据库的应用程序(SQL Server 2014企业版)。该应用程序调用存储过程来访问数据库。一切运行良好,直到最近开始发送以下错误并停止应用程序。重新启动应用程序可以暂时解决此问题,但稍后会遇到相同的错误。 错误:从服务器接收结果时发生传输级错误。(提供程序:TCP提供程序,错误:0-指定的网络名称不再可用。) 我进行了很多研究,其中大多数人指出这是网络问题,但找不到任何能真正解决问题的方法。有谁知道我应该在数据库方面进行哪些更改才能解决此问题。我非常感谢任何建议。

1
SQL Server-为什么更新语句中不允许使用窗口函数?
运行更新语句(例如下面的语句)时,我收到一条错误消息,告诉我 窗口函数只能出现在SELECT或ORDER BY子句中。 UPDATE dbo.Dim_Chart_of_Account SET Account_Order = LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) 我知道可以使用可更新的CTE轻松解决此问题,如下所示 WITH my_cte AS ( SELECT [Account_Order], LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) AS acc_order_lag FROM Dim_Chart_of_Account ) UPDATE my_cte SET [Account_Order] = acc_order_lag 我的问题是,是否有任何原因为什么不允许在更新语句中使用此方法,我应该避免使用可更新的CTE作为解决方法吗? 我担心的是,将窗口函数与更新语句一起使用时会出现问题,因此,我想了解这是一种可接受的方法还是应该避免。


3
为什么将自动更新统计信息设置为False?
作为更广泛的收购项目的一部分,我刚刚继承了大约20个SQL Server实例。我正在评估性能,我不喜欢实施维护计划的方式。 我看到每天进行一揽子索引重建(我可以处理这一问题),并且每天都在手动更新统计信息。 大约一半的数据库已设置为“自动更新统计信息= False”,原因除了我被告知要减少“性能问题”外,其他原因还不清楚。 我一直认为并努力将其设置为True的最佳实践,并认为如果此设置为True,则不需要手动更新。我错了吗? 谁能解释一下将此设置为False会有什么好处,但是每天进行一次手动更新呢? 我应该提到,某些数据库具有很高的事务性(每天有数以百万计的插入,删除,更新),而其他数据库的事务处理率很低,而有些则全部是只读的。尽管没有任何韵律或原因,但关于“自动更新”设置为“否”的信息。好像是彩票。

2
SQL Server示例统计信息更新在升序键列上错过最高的RANGE_HI_KEY
我正在尝试了解统计信息采样的工作原理,以及以下是否是采样统计信息更新的预期行为。 我们有一个按日期划分的大型表,其中有数十亿行。分区日期是先前的业务日期,因此是升序键。我们仅将前一天的数据加载到该表中。 数据加载会在一夜之间进行,因此在4月8日(星期五),我们加载了7月7日的数据。 每次运行后,我们都会更新统计信息,尽管需要抽样,而不是FULLSCAN。 也许我很天真,但我希望SQL Server能够确定范围内的最高键和最低键,以确保获得准确的范围样本。根据这篇文章: 对于第一个存储桶,下边界是生成直方图的列的最小值。 但是,它没有提及最后一个存储桶/最大值。 由于采样的统计信息是在8日上午更新的,因此该样本未达到表格(第7位)中的最高值。 由于我们对前一天的数据进行了很多查询,因此导致基数估计不准确,并且许多查询超时。 SQL Server是否应该不标识该键的最大值并将其用作最大值RANGE_HI_KEY?还是这仅仅是不使用更新的限制之一FULLSCAN? 版本SQL Server 2012 SP2-CU7。由于OPENQUERYSP3 中行为的变化,即四舍五入到SQL Server和Oracle之间的链接服务器查询中的数字,我们当前无法升级。

2
SQL Server不使用所有内存
我有SQL Server 2014,最大内存设置为6GB(物理内存为8GB)。 在目标服务器内存为6GB,有时,然后回落到总的服务器内存(约5.3GB,从未达到6GB)。我用committed_kb在sys.dm_os_sys_info检查SQL Server所使用的内存。 当我监视sys.dm_os_buffer_descriptors时,我看到页面已从缓存中删除-但仍然有700MB的内存。如果什么都不需要内存,您将如何解释从缓存中删除页面的事实?我希望SQL Server仅在需要内存时才删除页面。 在此服务器上,解除分配的临时表不是问题。我的PLE是3632。过程高速缓存是2182 MB。 我希望只有没有可用的内存时,页面才会被丢弃,但是我有700MB的可用空间,还是我误会了这一点? 有人可以尝试解释这种行为吗? SQL Server也在从磁盘读取数据,因此我想我可以得出结论,并非所有需要的页面都在内存中。 我进行了一些进一步的研究,并从磁盘将大量页面读取到内存中,并在读取过程中注意到taskmanager中的某些内容: 正在使用的内存从7.0GB-> 7.2GB-> 7.0GB-> 7.2GB-> ... Sqlservr.exe从5.3GB-> 5.5GB-> 5.3GB-> 5.5GB-> ... 就像Windows不允许sqlservr.exe增长到6GB一样。 我运行了Shanky提供的查询: select (physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB, (Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile process_physical_memory_low, process_virtual_memory_low from sys. dm_os_process_memory 得到以下结果: Physical_Memory_usedby_Sqlserver_MB: 5247 Locked_pages_used_Sqlserver_MB: 0 Total_Memory_in_MB: 5625 process_physical_memory_low: 0 process_virtual_memory_low: 0 …

1
内存表的性能比基于磁盘的表差
我在SQL Server 2014中有一个表,如下所示: CREATE TABLE dbo.MyTable ( [id1] [bigint] NOT NULL, [id2] [bigint] NOT NULL, [col1] [int] NOT NULL default(0), [col2] [int] NOT NULL default(0) ) (id1,id2)是PK。基本上,id1是将一组结果(id2,col1,col2)分组的标识符,其pk为id2。 我正在尝试使用内存表来摆脱现有的基于磁盘的表,这是我的瓶颈。 表中的数据被写入->读取->删除一次。 每个id1值都有数千个id2(成百上千)。 数据在表中存储的时间非常短,例如20秒。 在此表上执行的查询如下: -- INSERT (can vary from 10s to 10,000s of records): INSERT INTO MyTable SELECT @fixedValue, id2, col1, col2 …

6
修剪空白(空格,制表符,换行符)
我正在使用SQL Server 2014,需要从列内容的开头和结尾清除空格,其中空格可以是简单的空格,制表符或换行符(\n和\r\n);例如 ' this content ' should become 'this content' ' \r\n \t\t\t this \r\n content \t \r\n ' should become 'this \r\n content' 等等。 我只能用 UPDATE table t SET t.column = LTRIM(RTRIM(t.column)) 但在其他情况下,则无效。

1
为什么suser_name()无法反映AD帐户名称的更改?
我们的用户名之一已合法更改,因此我们将其Active Directory用户名更改为匹配-从domain \ oldname更改为domain \ newname。但是,当此用户在存储过程中调用suser_sname()时,它将返回旧名称,而不是新名称。 Googling将我引向了KB 946358,这表明它们的名称已在服务器上缓存并且未更新,大概是因为suser_name()正在调用LsaLookupSids。但是,该文章中的解决方法涉及重新启动服务器,即使是这样,我仍然想了解问题所在。 如果我将上下文更改为他们的上下文,则会返回正确的名称: EXECUTE AS LOGIN = 'domain\newname' GO SELECT suser_name() --returns 'domain\newname' ...我以为这也将调用LsaLookupSids,因此将返回错误的名称。我似乎不太了解此处的工作机制。 一些可能重要的观察结果: 该用户在服务器上没有显式登录。但是他们是这样做的AD组的成员。更改后的名称(domain \ newname)出现在的结果集中exec xp_logininfo 'domain\ADGroupName', 'members';域\旧名称没有。 用户正在从存储过程中调用suser_name(),该过程是从Access 2003 MDB中的直通查询调用的。 过去,我们已经更改了许多用户的帐户名,但是仅在上周才发现此问题(上周进行了两项更改,似乎都显示了该问题)。 该服务器正在Windows 2008 R2 Datacenter版上运行Sql Server 2008 SP3 x64。 这是怎么回事?作为DBA,我该怎么办?或者我打算在哪里解决这个问题?

1
升级后,SQL Server AlwaysOn数据库卡在“不同步” /“恢复”模式下。错误:无法打开数据库“…”版本782
测试从SQL Server 2014 SP1(12.0.4422.0)到SQL Server 2016 CTP 3.2(13.0.900.73)的升级时,我遵循建议的更新过程,并遇到了故障转移后数据库无法在旧主数据库上启动的问题到更新的中学。我们的设置是一个主副本和一个辅助副本,我完成的步骤是: 在同步提交的辅助副本上删除自动故障转移 将辅助服务器实例升级到新版本 手动故障转移到辅助副本 验证数据库在新的主副本上是否在线 将以前的主副本升级到新版本 辅助服务器的升级和故障转移以使其成为主要服务器,完全可以按预期进行。但是,在升级了先前的主副本之后,我注意到其上的数据库在SSMS中被列为“ 未同步/正在恢复”。同样尝试访问它们也会生成错误消息: 数据库...不可访问。(对象浏览器) 通过我看到的SQL Server日志进行检查 无法打开数据库“ ...”版本782。将数据库升级到最新版本。 查询master..sysdatabases表表明它确实是一个较旧的版本,并且在升级过程中未进行更新: 不幸的是,日志没有指出为什么不对其进行更新,并且可用性组仪表板仅给出一般性警告,指示某些可用性数据库的数据同步状态不正常,没有任何原因。 我尝试使用TSQL分离数据库或将其设置为脱机以“踢”数据库以进行更新,但是由于它们是SQL AG的一部分,因此这些命令不起作用。 如果数据库是SQL AG的一部分,如何将其升级到最新版本?



3
用空格替换列中的特殊字符
我正在尝试编写一个查询,以空格替换特殊字符。下面的代码有助于识别行。(字母数字字符,逗号和空格有效): SELECT columnA FROM tableA WHERE columnA like '%[^a-Z0-9, ]%' 如何将替换功能集成到select语句中,以便结果集中的所有字符(字母数字,逗号和空格除外)都被替换为''(空格)。这将不起作用: SELECT replace(columnA,'%[^a-Z0-9, ]%',' ') FROM tableA WHERE columnA like '%[^a-Z0-9, ]%'

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.