小编Mar*_*son的帖子

在 SQL Server 中的 DATETIME 列上按 MONTH 对数据进行分组

我有一个表Employee,其中包含列 ID、加入日期和名称

加入日期是一DATETIME栏。

我想知道十月份有多少用户加入?

sql-server group-by datetime

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

过滤索引抛出错误 - 更新失败,因为以下 SET 选项设置不正确:ANSI_WARNINGS

执行proc1时,出现如下错误:

更新失败,因为以下 SET 选项的设置不正确:“ANSI_WARNINGS”。验证 SET 选项是否正确用于计算列上的索引视图和/或索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。

我知道这是因为我在客户表上有一个过滤索引,这需要 SET ANSI_WARNINGS ON。

甚至我们需要一些 ANSI 选项,在创建过滤索引和存储过程时需要注意这些选项。这些事情我都处理过了。

我已经通过在 proc1 中设置 ansi_warning 解决了这个问题,我认为这是理想的解决方案。

但我的问题是,即使在 proc2 中设置了所有必需的 ANSI 选项之后,为什么我会收到此错误?任何的想法?

下面是我的示例代码:

create Customers
(
id int,
name varchar(100),
[Stats] BIT NOT NULL DEFAULT 1,
)
go

CREATE NONCLUSTERED INDEX [IX_Customers_Stats]
  ON [dbo].[Customers]([Stats])
  WHERE [Stats] = 0
go

CREATE PROC proc1
as
BEGIN
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;

....
...
.. some code .....
....
...

EXEC proc2 @customerId

END
go


createPROCEDURE [dbo].[proc2 ]  
    @customerId …
Run Code Online (Sandbox Code Playgroud)

sql-server filtered-index

6
推荐指数
1
解决办法
9367
查看次数

了解 sys.dm_exec_query_stats execution_count vs creation_time

我刚刚下载了 SQL Server 2012 'Performance Dashboard Reports',并且在解释其中一个结果显示的数据并将其链接回 DMV 时遇到了一些问题sys.dm_exec_query_stats

根据 CPU 报告,我执行最差的查询是已运行约 27K 次的插入语句。

当我使用query_hashfor 查询并将其放入下面的查询中时,我得到 62 个结果,每个结果都相同query_hashquery_plan_hash但具有不同的plan_handle值。

SELECT * FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS dest
WHERE query_hash = 0x1561B563078359C1
Run Code Online (Sandbox Code Playgroud)

根据BOLexecution_count显示:

自上次编译计划以来执行的次数。

creation_time显示

编制计划的时间。

我 99.9% 确定查询每 5 分钟运行一次,但结果集中的每个查询都有creation_time今天早上的计划,但每个查询都execution_count显示约 400。

SQL Server 如何确定这个数字?这些数字是通过某种方式联系起来的plan_hash还是每个人都是独一无二的plan_handle

performance sql-server dmv sql-server-2012 performance-tuning

5
推荐指数
1
解决办法
7433
查看次数

为什么此查询不使用 SURNAME 上存在的索引?

PATIENTS 表中的 SURNAME 上有一个索引,我们运行以下查询但该索引没有被使用。

DECLARE @SURNAME VARCHAR(30) = 'test'

SELECT SURNAME 
FROM PATIENTS AS PAT
WHERE (PAT.SURNAME LIKE @SURNAME + '%' OR @SURNAME IS NULL)
Run Code Online (Sandbox Code Playgroud)

这似乎是因为我们检查变量是否NULL就像我删除了它然后我得到了一个常量扫描、计算标量、索引查找和嵌套循环。

我们需要检查参数是否NULL为我们然后在 where 子句中忽略它。

有没有办法做到这一点并让 SQL 使用索引?

t-sql

5
推荐指数
1
解决办法
188
查看次数

DBCC CHECKDB 基于一致性的 I/O 错误

跑步:

DBCC CHECKDB(DatabaseName) with NO_INFOMSGS 
Run Code Online (Sandbox Code Playgroud)

给了我以下错误:

消息 824,级别 24,状态 2,第 1 行
SQL Server 检测到基于逻辑一致性的 I/O 错误:pageid 不正确(预期为 1:7753115;实际为 0:0)。它发生在读取文件 'K:\UAT Databases\dbname.MDF' 中数据库 ID 11 中偏移量 0x00000ec9b36000 的页面 (1:7753115) 期间。SQL Server 错误日志或系统事件日志中的其他消息可能会提供更多详细信息。这是威胁数据库完整性的严重错误情况,必须立即纠正。完成完整的数据库一致性检查 (DBCC CHECKDB)。此错误可能由多种因素引起;有关详细信息,请参阅 SQL Server 联机丛书。

我还在dbo.suspect_pages 中找到了一个条目

请指教。

sql-server sql-server-2008-r2 dbcc-checkdb consistency

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

ALTER TABLE SWITCH 语句失败。不允许 SWITCH,因为源表 '' 包含约束 '' 的主键

我正在使用 SQL Server 2008。

我有两张桌子PARTITIONTESTTABLEPARTITIONTESTTABLESUB. PARTITIONTESTTABLESUB有一个外键PARTITIONTESTTABLE。我创建了分区,这两个表都已分区。我还从管理分区向导创建了临时表。

当我跑....

ALTER TABLE  PARTITIONTESTTABLESUB SWITCH PARTITION 10 to [staging_PARTITIONTESTTABLESUB]; 
Run Code Online (Sandbox Code Playgroud)

...它运行成功。

但...

ALTER TABLE  PARTITIONTESTTABLE SWITCH PARTITION 10 to [staging_PARTITIONTESTTABLE]; 
Run Code Online (Sandbox Code Playgroud)

...失败,错误:

ALTER TABLE SWITCH 语句失败。不允许 SWITCH,因为源表“Enterprise.MSH2.PARTITIONTESTTABLE”包含约束“staging_PARTITIONTESTTABLESUB_PARTITIONTESTTABLESUB_FK”的主键。

DDL:

CREATE TABLE [PARTITIONTESTTABLE](
    [pkcol] [int] IDENTITY(1,1) NOT NULL,
    [datacol1] [int] NULL,
    [datacol2] [int] NULL,
    [datacol3] [varchar](50) NULL,
    [partitioncol] [datetime] NOT NULL,
 CONSTRAINT [PK_PARTITIONTESTTABLE] PRIMARY KEY CLUSTERED 
(
    [pkcol] ASC,
    [partitioncol] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, …
Run Code Online (Sandbox Code Playgroud)

sql-server partitioning

4
推荐指数
1
解决办法
2427
查看次数

查询 XML 嵌套节点

我需要将每日 XML 文件集成到我的系统中。

XML 文件具有与此类似的架构:

create table txml(id int identity, data xml);
insert into txml (data) values ('
<order>
    <trans DTrans="20170102" HTrans="10:52"></trans>
    <head Id="552665566"></head>
    <lin headId="552665566">
        <dLin Id="00001" CoArt="1111111" CoArtCust="05220001" NameArt="Product1" dateVal="20161115" />
        <acum DCalAcm="20170101" DIniAcm="20161115"><qtyAcm Qty="1101163.00" /></acum>
        <lastOrd Id="95767" QtyLastOrd="12000.00" DLastOrd="20170101" />
        <pLin LType="4"><uni Qty="24000.00"/><dIni Date="20170104"/><dEnd Date="20170108"/></pLin>
        <pLin LType="4"><uni Qty="20000.00"/><dIni Date="20170109"/><dEnd Date="20170112"/></pLin>
        <pLin LType="4"><uni Qty="24000.00"/><dIni Date="20170113"/><dEnd Date="20170116"/></pLin>
    </lin>
    <lin headId="552665566">
        <dLin Id="00002" CoArt="2222222" CoArtCust="05269958" NameArt="Product2" dateVal="20161101" />
        <acum DCalAcm="20170101" DIniAcm="20161101"><qtyAcm Qty="552652.00" /></acum>
       <lastOrd Id="49956" QtyLastOrd="5000.00" DLastOrd="20170101" />
        <pLin LType="4"><uni …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 xml sql-server

4
推荐指数
1
解决办法
4603
查看次数

为什么查询缓存计划保留动态查询而不保留 sp?

我的公司有一些使用大量动态查询(无参数)的遗留系统。在较新的系统中,我们使用存储过程和参数化 SQL。然而,我们发现我们的存储过程经常出现性能峰值。

我查看了它,似乎计划缓存会定期清除存储过程计划,但在计划缓存中保留了大量动态 SQL 语句。

我对 SQL Server (SQL Server 2017) 这样做的原因有点困惑。SQL Server 如何决定删除哪一个?

sql-server execution-plan plan-cache

4
推荐指数
1
解决办法
372
查看次数

表 &lt;table_name&gt; 中的计算列 'IsWeekend' 无法持久化,因为该列是不确定的

我正在调整 SQL Server 2012 中的查询,该查询由于DATENAME()在列上使用该函数检查数据是周末还是工作日时基数估计不正确而溢出到 tempdb 。由于使用该函数,查询是不可sargable的,并且错误估计了行数(估计1700,实际38000)。

where 子句很简单:

WHERE DATENAME(WEEKDAY, vqc.DateRecorded) NOT IN ('Saturday', 'Sunday')
Run Code Online (Sandbox Code Playgroud)

我希望使用持久计算列,然后对其进行索引:

ALTER TABLE <table_name> ADD IsWeekend AS DATENAME(WeekDay, DateRecorded) PERSISTED;
Run Code Online (Sandbox Code Playgroud)

但是得到错误:

无法保留表中的计算列“IsWeekend”,因为该列是不确定的。

根据BOL,大量 Date 函数无法持久化,因为它们是不确定的。

这是因为结果取决于服务器会话的 LANGUAGE 和 DATEFORMAT 设置。例如,表达式 CONVERT (datetime, '30 listopad 1996', 113) 的结果取决于 LANGUAGE 设置,因为字符串 '30 listopad 1996' 表示不同语言的不同月份。同样,在表达式 DATEADD(mm,3,'2000-12-01') 中,数据库引擎根据 DATEFORMAT 设置解释字符串 '2000-12-01'。

有一个有趣的方法来解决这个问题,该MONTH()函数使用CASE发布在Stack Overflow上的声明,但这对DATENAME由于SET DATEFIRSTLANGUAGE设置不起作用。

除了在我的查询中加入日历表然后从那里过滤周末之外,有没有办法确定日期是否是周末,以便它可以被持久化然后索引?

还是我想把情况复杂化?

sql-server determinism

3
推荐指数
1
解决办法
2061
查看次数

是否有维护计划来检查我的数据库是否损坏?

有什么方法可以让维护计划在单个实例上检查我的所有数据库?保养计划Check Database Integrity Task够吗?

sql-server-2008 maintenance sql-server-2008-r2 corruption maintenance-plans

3
推荐指数
1
解决办法
855
查看次数