标签: sql-server

如何跳过 SQL Server 查询中的行?

我从我的product表中选择了一个额外的 Row_Number() 列 (Num) 的查询,我得到了如下的答案(我只限制了 20 行来检索)。

询问

SELECT * 
FROM (SELECT ROW_NUMBER() OVER(ORDER BY ProductCode) AS Num, 
             ProductName
      FROM   BASE_Product 
      WHERE IsActive = 1) BASE_Product 
WHERE Num > 0 
AND   Num < (21)
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

我的要求是如何跳过每 3 行并仅检索 7 个限制行。

预期结果

我需要如下结果:

在此处输入图片说明

sql-server sql-server-2012 sql-server-2014

2
推荐指数
1
解决办法
8559
查看次数

找不到用户,因为它不存在或您没有权限

我正在使用 mssql,我想实现这一目标:拥有 1 个数据库,2 个非 SA 用户。第一个用户应该是数据库的所有者,第二个用户应该对某些表具有读取权限,对其他表具有读+写权限。

第二个用户的表是由我们使用第一个用户的应用程序创建的。

我所做的步骤:
1)我执行创建 DB + 用户的脚本

CREATE LOGIN USER1
WITH PASSWORD = 'password';
GO
CREATE USER USER1 FOR LOGIN USER1;
GO

CREATE DATABASE my_database;
ALTER AUTHORIZATION ON DATABASE ::my_database TO USER1;

CREATE LOGIN USER2
WITH PASSWORD = 'password';
GO
CREATE USER USER2 FOR LOGIN USER2;
GO
Run Code Online (Sandbox Code Playgroud)

2) 我的应用程序执行创建表的脚本 + 向 USER2 授予对表的权限,这失败了,因为:

Cannot find the user 'USER2', because it does not exist or you do not 
have permission.
Run Code Online (Sandbox Code Playgroud)

我的问题是如何授予 USER1 权限以在 my_database 中为其他用户添加读/写权限?不过,那个数据库所有者就足够了。 …

sql-server permissions

2
推荐指数
1
解决办法
2万
查看次数

为什么计算列会突然降低性能?

用户可以在上午 10 点之前运行报告。在同样的报告变得非常缓慢之后,有时用户只是没有耐心等待。经过一些故障排除后,我找到了导致延迟的列。它是计算列,它使用函数来带来结果。

大约在同一时间,我收到了另一个关于运行缓慢报告的抱怨,那总是工作正常。经过一些故障排除后,我发现了导致延迟的列:

where (Amount - PTD) <> 0
Run Code Online (Sandbox Code Playgroud)

同样,该Amount列是计算列。

所以我的问题是:为什么总是作为报告一部分的所有突然计算列开始显着降低性能?大约在上午 10 点之后真正会发生什么?如果我制作这些列有persisted什么缺点?

谢谢

--FUNCTION 带列:

ALTER FUNCTION [dbo].[CalcInvoiceAmtPTD]
(@SInvNum INT, @entityGuid uniqueIdentifier) RETURNS MONEY
AS
BEGIN
    DECLARE @Amt MONEY

    declare @toplevel uniqueidentifier
    set @toplevel = (select dbo.gettoplevelentity(@entityguid))

    declare @t table 
    (
        Guid uniqueidentifier
    )

    insert into @t select * from dbo.getlinkedentities(@toplevel) where guid is not null
    declare @tbl table (amount money, glacctid int)

    select @amt = isNull(sum(amount), 0) from tblfin_journalpostings jp
        inner join tblfin_journal …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql

2
推荐指数
1
解决办法
6006
查看次数

执行查询所花费的时间似乎比查询中测量的时间长......?

我正在尝试优化存储过程。我仅使用日期变量将一些手动分析插入到我的 SP 中,然后使用 datediff 显示经过的时间。

例如

DECLARE @MyDate datetime = GetDate()
PRINT '..profiling text...'
PRINT DateDiff(ms, @MyDate, GetDate())
SET @MyDate = GetDate()

<execute some actions here>

PRINT '..elapsed time...'
PRINT DateDiff(ms, @MyDate, GetDate())
SET @MyDate = GetDate()
Run Code Online (Sandbox Code Playgroud)

当我在 SQL Server Management Studio 的查询窗口中运行它时,我的配置文件的总耗用时间大约为 5 秒。但是,整个查询的持续时间更像是 14 秒,如右下角的查询属性所示(以及当我用手表手动计时时)。

有什么理由会发生这种情况吗?我放置或声明日期变量的位置没有任何问题。通过 datediff 和查询所用的时间输出的时间肯定不匹配。

还应该注意的是,在优化时,我没有返回任何大型数据表。我只是将它们插入到临时表中,以确保我没有返回结果的开销。

sql-server t-sql

2
推荐指数
1
解决办法
250
查看次数

SSMS 连接到本地开发数据库的速度极慢

所以我发现了这个问题并相信这是相关的。 使用 Windows 身份验证时 SQL Server Management Studio 连接缓慢或超时

如果我将超时延长到 30 秒,我会连接 SSMS,但一切都非常慢!调试时应用程序非常慢/超时。

他们提到向主机文件添加一个条目以绕过 DNS 查找。这是在我的机器上运行的本地开发数据库。我会在主机文件中添加什么来消除这些 DNS 问题???服务器名称 = "ROG-DREAM-MACHI\SQLDEV"。

我是数据库菜鸟。请帮忙。:(

sql-server ssms sql-server-2012

2
推荐指数
1
解决办法
3946
查看次数

如何在此日志记录表上优化此查询?

我正在尝试为记录事件的表格优化表格布局。

日志表包含三个相关的列:Timestamp, ItemId, LocationId
每行表示在给定的timeitem已经在某个 看到了某个location

2017-01-01 10:00    Item A has been seen at location 1
2017-01-01 10:01    Item A has been seen at location 1
2017-01-01 11:00    Item B has been seen at location 1
2017-01-01 11:01    Item B has been seen at location 2
2017-01-01 11:02    Item A has been seen at location 2
2017-01-01 11:03    Item B has been seen at location 1
Run Code Online (Sandbox Code Playgroud)

大约有 100 个不同的位置、每天 20.000 个新项目、每天一百万个事件和 14 天的日志。 …

performance database-design sql-server sql-server-2012 denormalization

2
推荐指数
1
解决办法
227
查看次数

AlwaysOn DDL 和架构更改

任何人都可以讨论如何逐步将 DDL 架构更改与 Always On Availability Groups 准确合并?我们在一个状态有一个主副本,在另一个状态位置有一个辅助副本。辅助副本将是只读异步的。

如果我要进行架构更改,包括任何种类...

例子

  1. 添加/修改/删除表上的列
  2. 添加/修改/删除表外键约束
  3. 添加/修改/删除聚集和非聚集索引
  4. 添加/修改/删除默认约束
  5. 添加/修改/删除存储过程和函数
  6. 添加/修改/删除触发器
  7. 添加/修改/删除视图

... 我需要什么才能确保主副本 DDL 顺利流向次副本?

我的假设

次要副本上的读取查询不会影响主 DML(数据修改、插入、更新、删除),并且会顺利进行,因为次要副本设置为读取快照隔离。

次要副本上的读取查询会影响主 DDL(模式更改、表结构更改),因为读取查询会放置模式锁。

解决方案

停止对从副本的所有查询,进行主副本DDL,然后DDL变化会流向从副本。

  • 在此过程中是否还需要其他任何步骤?
  • 还有什么需要认真做的?
  • 关闭辅助副本上的所有读取查询的最佳方法是什么?杀死/关闭 Spid,立即使用回滚设置 SINGLE_USER?

此示例仅用于辅助只读异步。如果辅助副本是只读同步的怎么办?


其他背景:Primary Replica是OLTP,日夜事务。我们公司有一个部署变更管理时间窗口。假设我早上只有 1 小时来执行架构和 DDL 更改。我不能等待长时间的查询完成。在异步模式下,日志重做永远不会是最新的。

我记得读过 Microsoft 文章Active Secondary:Readable Secondary Replicas (Always On Availability Groups)

sql-server availability-groups

2
推荐指数
1
解决办法
2286
查看次数

检索表列中选择查询的值

对于以下查询,我需要替代游标/while 循环:

我们有一个表格,如下面的屏幕截图所示,包含以下列:ID, Module, Query。该表包含近 100,000 条记录。目前,我们正在使用游标和 while 循环将选择查询的输出插入到临时表中,我们将根据ID.

在此处输入图片说明

我需要帮助编写一个查询,该查询将Query列作为输入并像函数一样将结果作为值提供。

我试图创建其执行动态SQL功能,但它失败,因为EXECsp_executesql没有一个函数中允许的。尝试使用存储过程也不起作用,因为我们只能将一个查询作为参数从该表中传递以获取作为值的输出。

每个查询返回一个值(一列,一行)。不同的查询可能返回不同数据类型的值;所有都应转换为nvarchar.

任何解决方案将不胜感激。

sql-server

2
推荐指数
1
解决办法
4118
查看次数

SQL Server 排序规则不匹配会减少应用程序可见的数据量吗?

我们的一台服务器最近死了,它用错误的排序规则重建,所以它看起来如下:

  • SQL Server - SQL_Latin1_General_CP1_CI_AS
  • 主数据库 - SQL_Latin1_General_CP1_CI_AS
  • 模型数据库 - SQL_Latin1_General_CP1_CI_AI
  • msdb 数据库 - SQL_Latin1_General_CP1_CI_AI
  • 临时数据库 - SQL_Latin1_General_CP1_CI_AS
  • 每个用户数据库 - SQL_Latin1_General_CP1_CI_AI

数据库是可访问的,我的问题是:用户通过应用程序可见的数据是否会因为排序规则不匹配而受到限制?一些用户表示,即使数据库是从最近的备份中恢复的,他们也认为自己丢失了大量数据。

它是 Windows Server 2012 R2 上的 SQL Server 2008 R2 SP3(仅由于服务包而兼容)

谢谢

sql-server collation

2
推荐指数
1
解决办法
640
查看次数

授予对每个数据库中的系统“sys”表的最小选择权限

我们的开发团队创建了一些 SSRS 报告,这些报告仅从每个数据库中检索元数据(非“真实”数据)。我试图将运行这些报告的服务帐户锁定到所需的最低权限。

查询仅从每个数据库中的系统表中进行选择,例如:

 sys.tables
 sys.extended_properties
 SYS.objects
 SYS.schemas
 sys.dm_db_partition_stats
 sys.indexes
Run Code Online (Sandbox Code Playgroud)

我认为以下会做到这一点,但没有这样的运气。

 GRANT VIEW ANY DATABASE TO [DOMAIN\LOGIN]
 GRANT VIEW SERVER STATE TO [DOMAIN\LOGIN]
 GRANT VIEW DATABASE STATE TO [DOMAIN\LOGIN]
Run Code Online (Sandbox Code Playgroud)

查询系统表给出错误:

 The server principal "DOMAIN\LOGIN" is not able to access the database "DATABASENAME" under the current security context.
Run Code Online (Sandbox Code Playgroud)

除了为每个数据库的登录创建一个用户然后显式授予系统表的权限之外,我似乎找不到其他方法来解决这个问题。这对所有未来的数据库提出了一系列新的挑战。我是否遗漏了什么,或者没有简单的方法可以在不授予“系统管理员”服务器级角色的情况下向所有数据库授予此访问权限?

security sql-server permissions logins system-tables

2
推荐指数
1
解决办法
5234
查看次数