Questions tagged «sql-server»

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


1
使用Join和Window函数获取超前和滞后值之间的性能比较
我有20M行的表,每一行有3列:time,id,和value。对于每个id和time,value状态为。我想知道的超前滞后一定的值,time为特定的id。 我使用了两种方法来实现此目的。一种方法是使用连接,另一种方法是使用窗口函数超前/滞后以及在time和上的聚集索引id。 我按执行时间比较了这两种方法的性能。join方法需要16.3秒,而window函数方法需要20秒,这不包括创建索引的时间。这使我感到惊讶,因为在join方法是蛮力的情况下,窗口功能似乎已被改进。 这是这两种方法的代码: 创建索引 create clustered index id_time on tab1 (id,time) 加盟方法 select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 on a1.id = b1.id and a1.time-1= b1.time left join tab1 c1 on a1.id = c1.id and a1.time+1 …

6
由于会话处于终止状态,因此无法继续执行。在建立聚集索引时
尝试创建聚簇索引时出现以下错误 该语句已终止。 消息596,级别21,状态1,行0 无法继续执行,因为会话处于终止状态。 消息0,级别20,状态0,行0 当前命令发生严重错误。结果(如果有的话)应丢弃。 索引是: BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION GO CREATE CLUSTERED INDEX IX_CO_DES_INPUT ON dbo.CO_DES_INPUT(DESIGN_ID, PRODUCT_INPUT_NUM, INPUT_NAME) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = …


3
WITH CTE和WITH CTE(<column_names>)有什么区别?
如在MSDN上使用通用表表达式中所示,可以将CTE定义为: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition ) 并像这样使用它: SELECT &lt;column_list&gt; FROM expression_name; 假设我有2个CTE with cte1 as( select name from Table1 ) with cte2(name) as( select name from Table1 ) 由于内部查询相同,因此两个CTE的查询输出结果相同。两者之间的唯一区别是cte2(name)在其声明中定义了列name()。 当我执行两个CTE时,执行计划没有任何区别。 我只是好奇地知道: 如果我在CTE定义中未指定任何列名,会有什么区别? 为什么在创建CTE时应该/不应该指定列名? 它是否会偶然影响查询执行计划?(据我所知,这没有任何区别。)

6
如何在MS SQL Server上修复混乱的复制
我从备份还原了数据库。数据库使用复制发布到其他服务器。假设数据库还原会破坏复制,我尝试删除该复制并重新创建它(我们有一个脚本可以从头开始重新创建它)。我不确定自己所做的确切,但是现在它处于完全混乱的状态,我无法修复。 首先,我尝试摆脱订阅(在发布服务器上): EXEC sp_dropsubscription @publication = 'PublicationName', @article = N'all', @subscriber = 'SubscriberServerName' 这似乎有效。SELECT * FROM syssubscriptions没有显示结果。在订阅服务器上,SSMS&gt; {SubscriberServer}&gt;复制&gt;本地订阅-订阅不存在。 因此,我尝试删除该出版物。SSMS&gt; {服务器}&gt;复制&gt;本地发布&gt; {PublicationName}&gt;删除。这给出以下错误信息: Could not delete publication 'PublicationName'. Could not drop article. A subscription exists on it. Changed database context to 'DatabaseName'. (Microsoft SQL Server, Error: 14046) 好的,所以我尝试删除文章: EXEC sp_droparticle @publication = …

4
正确的存储值的方式可能是多种不同的类型
我有一个答案表和一个问题表。 答案表中有值,但根据问题,这个值可以是一个bit,nvarchar或number(到目前为止)。该问题具有其预期答案值类型应为什么的概念。 在一个或另一个点解析这些Answer值非常重要,因为至少需要对这些数字进行比较。 对于更多情况,一些用户在各种调查中提供了问题和可能的答案(通常是文本框类型输入所允许的数据类型)。然后,其他指定的用户将提供答案。 我考虑过的几个选项是: A. XML或字符串,根据所需的类型进行不同的解析(在问题中始终保持跟踪) B.引用答案表(或由答案表引用)的三个单独的表,并根据预期的类型联接到其中。在这种情况下,我不确定设置约束的最佳方法,以确保每个问题只有一个答案,或者应该将其留给应用程序。 C. Answer表上的三个独立列可以根据预期的类型进行检索。 我很高兴就这些方法的优缺点获得一些意见,或者我没有考虑过的替代方法。

3
导入为VS DB项目后出现“对用户的未解析引用”
我只是将现有的SQL Server 2008r2生产数据库导入到VS 2013数据库项目中。 我现在遇到了一些错误 Error SQL71501: User: [mydbuser] has an unresolved reference to Login [mydbuser]. 我实际上并不需要我的VS DB项目来管理用户,但是我担心如果不存在,它将在部署时尝试删除它们。 文件本身生成为 CREATE USER [mydbuser] FOR LOGIN [mydbuser]; 要么 CREATE USER [mydomainuser] FOR LOGIN [MYDOMAIN\mydomainuser]; 错误标记表明它专门用于Login。由于这是一个系统级对象,因此我可以理解它超出了db项目的范围。 我是否全部将其更改为 CREATE USER [mydbuser] WITHOUT LOGIN; 或将CREATE LOGIN子句添加到每个文件的开头? 删除登录参考似乎更简单,而完全删除用户将是最简单的。 我想确保我按预期使用该工具。将这些重新发布回生产中是否会有任何问题?通过项目添加用户/登录的正确程序是什么?


5
DELETE语句与REFERENCE约束冲突
我正在尝试删除所有用户,但出现错误: Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_M02ArticlePersons_M06Persons". The conflict occurred in database "workdemo.no", table "dbo.M02ArticlePersons", column 'M06PersonId'. The statement has been terminated. 查询: DELETE FROM [workdemo.no].[dbo].[M06Persons] WHERE ID &gt; '13' GO 似乎我需要使用,on delete cascade;但卡住了。
11 sql-server  t-sql 

1
DMV sys.dm_exec_query_stats中的last_worker_time和last_elapsed_time有什么区别?
DMV sys.dm_exec_query_stats中的last_worker_time和last_elapsed_time是什么意思,它们之间有什么区别? 当我在查询下面触发 SELECT TOP 20 qs.last_worker_time, qs.last_worker_time/1000000 last_worker_time_in_S, qs.last_elapsed_time, qs.last_elapsed_time/1000000 last_elapsed_time_in_S FROM sys.dm_exec_query_stats qs order by qs.last_worker_time desc 我得到如下结果。 关于我发现要么两者都是相等的,要么是经过的时间大于工作人员的时间。我想理解两者的意义,因此也可能有助于我进行性能调整。

6
尝试在数据库2中获取逻辑页(5:65424)失败
SqlException在调用存储过程时,我得到以下信息: 尝试在数据库2中获取逻辑页(5:65424)失败。它属于分配单元7349876362857938944,而不属于4899918190390149120。 发生System.Data.SqlClient.SqlException Message =“试图在数据库2中获取逻辑页面(5:65424)失败。它属于分配单元7349876362857938944,而不是属于4899918190390149120。 Source =“。Net SqlClient数据提供程序” ErrorCode = -2146232060 类= 21 LineNumber = 257 Number = 605 过程=“ ispDisplayCount” Server =“ 10.10.1.1” State = 3 此异常是什么意思?上述问题有解决方案吗? 尽管上面的错误中引用的数据库指示tempdb,但使用以下答案可以修复引用消息605的类似错误。 消息605,级别21,状态3,行1 尝试获取数据库7中的逻辑页(1:8687634)失败。它属于分配单元72057594364821504,而不是72057594052476928。

5
备份->恢复操作后混乱的用户权限
我不得不将几个SQL Server 2008数据库移动到我们的新数据库服务器,因此我将它们全部备份(到.bak文件),将这些文件复制到新框中并还原它们(所有操作都使用SQL Management Studio完成)。 一切正常,但是现在我发现我无法使用继续在旧RDBMS上运行的SQL Server帐户登录任何数据库。我的Windows身份验证登录仍然可以正常工作。 我有这样的想法,用户和权限都可以无缝地复制到新的数据库服务器上,但是似乎某个地方出了问题。我将不胜感激/建议/建议;-)


1
批量插入后,外键变得不受信任
在具有2012兼容模式下数据库的SQL 2014版服务器(12.0.2430.0-尚无SP1)中(正在努力将其切换到2014 ...),我有少数几个外键对象,这些外键对象not trusted在数据库中始终标记为。我删除并重新创建了没有NOCHECK选项的它们,但是在5到10分钟内,它们再次变得不受信任,如果我生成CREATE脚本,它将显示为: ALTER TABLE [dbo].[Points] WITH NOCHECK ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO 使用的创建脚本为: ALTER TABLE [dbo].[Points] ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId] GO 没有复制,没有第三方工具,而且我正在监视数据库中的所有DDL语句,因此它不是另一个用户。 我能够很好地检查约束(WITH CHECK CHECK在每个约束上使用),但是不久之后它们仍然变得不受信任。只有运行的维护工作是Ola在AM的早期工作,并且整天都在进行。 更新: 因此,在经过几次跟踪以缩小可能性后,似乎BULK INSERT可能导致FK变得不可信。这个msdn问题指出,这是密钥变得不受信任的有效途径,这是我第一次听说。 所以我现在的问题是,有没有一种替代方法BULK INSERT可以保持外键is_trusted状态?它是在每小时运行几次的应用程序的上下文中执行的。我可以让开发人员批处理其插入语句,但是BULK INSERT如果不需要的话,我不希望在使用时使用最后通atum 。

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.