标签: sql-server-2012

为什么分区范围右跳过删除/插入?

我有两个示例查询(如下所示)。两者(删除和)都在其中创建一个数据库和一个分区表。该表有几个分区,每个分区都有数据(包括最后一个,无界的,一个)。分区数据从 1 到 3996。

然后每个脚本添加一个新分区。新分区从 4000 开始。

在第一个脚本中,事务日志显示最后一个分区(分区 4)中的每条记录都被删除并重新插入。

第二个脚本显示没有发生行的活动(没有删除和插入)。

只有两个脚本之间的区别是RANGE LEFTVSRANGE RIGHT的分区函数。 RANGE RIGHT导致不删除或插入,RANGE LEFT导致最后一个分区中的所有行被删除和重新插入。

我想RANGE LEFTRANGE RIGHT只是控制边界值是否与左侧或右侧分区一致。但它显然也做了其他事情。

是否有更多的RANGE LEFTRANGE RIGHT我不明白?

另外,我喜欢在不影响系统的情况下添加分区的想法。RANGE RIGHT如果它让我知道,我愿意使用。但是,我担心这可能是某种错误,我不应该依赖它(因为它可能会在以后的版本中“修复”)。

这是一个可以依赖的“功能”吗?


脚本:

Range Left
删除和插入

use master
GO
-- Comment this next line out for the first run
DROP database PartitionTest
go
create database PartitionTest
go
use PartitionTest
go
-- Add Filegroups
ALTER DATABASE [PartitionTest] ADD FILEGROUP …
Run Code Online (Sandbox Code Playgroud)

sql-server partitioning sql-server-2012

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

何时更喜欢截断而不是批量删除?

当我浏览 DBA-Reactions 时,我几乎理解了所有的 .gif,但是使用这个我遇到了麻烦:

https://twitter.com/DBAReactions/status/613840893322338304

我的意思是 truncate 显然不会像批量删除那样创建事务日志,但仍然存在您非常确定可以简单地截断完整表的情况。除此之外还有其他的顾虑吗?所以基本上我很想了解完全不同。

sql-server truncate sql-server-2012

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

WHERE NAME LIKE (一组名字)

我想删除与一组特定数据库相关的所有作业。

因此,我已将所有名称添加到表变量中,并尝试生成脚本以删除作业。

我怎样才能做到这一点?

use msdb
go


DECLARE @R TABLE ( NAME VARCHAR(108) NOT NULL PRIMARY KEY CLUSTERED)

INSERT INTO @R(NAME)
SELECT 
'UK15SUMMProduct' UNION ALL SELECT 
'US15SUMMProduct' UNION ALL SELECT 
'DE15SUMMProduct' UNION ALL SELECT 
'AT15SUMMProduct' UNION ALL SELECT 
'FR15SUMMProduct' UNION ALL SELECT 
'EU15SUMMProduct' UNION ALL SELECT 
'AU15SUMMProduct' UNION ALL SELECT 
'UK15SUMSProduct' UNION ALL SELECT 
'US15SUMSProduct' UNION ALL SELECT 
'DE15SUMSProduct' UNION ALL SELECT 
'AT15SUMSProduct' UNION ALL SELECT 
'FR15SUMSProduct' UNION ALL SELECT 
'EU15SUMSProduct' UNION ALL SELECT 
'AU15SUMSProduct'


SELECT S.* 
FROM SYSJOBS S
WHERE …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 select sql-server-2012 sql-server-2014

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

按发生率最高的值排序

我有一个表作为这个例子:

CREATE TABLE customerEvent(
    customerID  int NOT NULL,
    eventID     int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

customerID 可能出现在许多记录中。我使用以下查询来识别最常用的 customerID:

SELECT
    customerID,eventID
    ,row_number() OVER(PARTITION BY customerID ORDER BY eventID) as frequency
FROM customerEvent
ORDER BY frequency DESC
Run Code Online (Sandbox Code Playgroud)

有了这个我看到了那些最频繁的customerID。但它们仅在列表顶部出现一次。例子:

customerID  eventID frequency
7           3       5
15          9       4
7           1       4
9           4       3
7           10      3
15          2       3
Run Code Online (Sandbox Code Playgroud)

我需要最频繁的 customerID 的所有记录出现在顶部,例如:

customerID  eventID frequency
7           3       5
7           1       4
7           10      3
15          9       4
15          2       3
9           4       3
Run Code Online (Sandbox Code Playgroud)

知道如何构建一个查询吗?

sql-server t-sql sql-server-2012

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

SQL Server 插入后触发器不执行操作

我有 2 个插入后触发器和 1 个而不是插入触发器的问题。After Insert 触发器应该执行一些操作,但不会触发这些操作。

当替代触发器触发时,它们的动作 After Triggers 工作正常。

让我解释:

“替代”触发器验证该ID值是否为 Null。如果是,则触发器在表 ( TRADE_APPR) 中执行插入操作,填充IDSQL Server 序列中的值。

当替代触发器执行操作时,插入后触发器也执行它们的操作。

我的而不是插入触发器的代码是这样的:

ALTER TRIGGER [ConfirmMgr].[TG_TRADE_APPR_BER_I] 
ON [ConfirmMgr].TRADE_APPR] 
INSTEAD OF INSERT
AS
   DECLARE
      @user_name            varchar(50),
      @appr_username        varchar(50),
      @appr_id          int,
      @v_id             int,
      @appr_timestamp       datetime
BEGIN 
    SELECT @appr_username = APPR_BY_USERNAME FROM inserted

    IF (@appr_username) IS NULL
    BEGIN
            SELECT @user_name = SUSER_NAME()
            UPDATE tbl SET APPR_BY_USERNAME = UPPER(@user_name)
            FROM ConfirmMgr.TRADE_APPR tbl
            INNER JOIN inserted i ON tbl.ID = i.ID
    END …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server dml sql-server-2012

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

查询谁支付了超过 10k

我有一张包含付款信息的表格,如下所示:

ID COSTUMER_ID DATEPAID     AMOUNT
1    1        2012-01-01      50
2    1        2012-02-01      100
3    1        2012-03-01      70
4    2        2012-03-01     6000
4    2        2012-09-01     3000
4    2        2014-04-01     8000
5    3        2013-03-01     9000
6    3        2013-08-01     3000
Run Code Online (Sandbox Code Playgroud)

等等。我需要知道哪些客户在 12 个月内支付了超过 10,000 美元。(在示例中,只有客户 3 适合)。不要介意什么时候,唯一的标准是在任何连续 12 个月的组合中 SUM(AMOUNT) > 10000。

但我坚持下去。有任何想法吗?我正在使用 SQL Server 2012。

sql-server select sql-server-2012

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

如何在 SQL Server 2012 中禁用区分大小写?

我尝试collation_namesys.databases. 我正在尝试将 'SQL_Latin1_General_CP1_CS_AS' 更改为 'SQL_Latin1_General_CP1_CI_AS' 以禁用表中的区分大小写。

update d set d.collation_name='SQL_Latin1_General_CP1_CI_AS'
--SELECT name, collation_name 
FROM sys.databases d
WHERE name = 'db_name' 
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:


不允许消息 259,级别 16,状态 1,第 1 行对系统目录进行临时更新。

collation character-set sql-server-2012 unicode

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

列出所有用户数据库中的所有表

sys.tables 列出单个数据库中的所有用户表,但没有它们的架构名称。

如果我在创建代码时知道现有数据库,我可以使用它USE来浏览所有数据库,查询sys.tables其表,并将列表插入到临时表中以供以后使用。

但是,有没有更简单的方法来做到这一点,并且通过唯一的查询能够从所有用户数据库中检索所有用户表及其架构?

sql-server sql-server-2012

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

出现错误“等待页面 (1:3564879) 的缓冲区闩锁类型 2 时发生超时,数据库 ID 7。” 但是 ID 为 7 的数据库不存在

我有一个测试环境,我在其中安排了运行还原测试和 DBCC 检查的作业。这些作业运行到:
1)从产品复制数据库备份。
2)DROPdba_utility
3) 恢复备份之外的所有现有数据库
4) 运行dbcc checkdb

我经常得到:

Time-out occurred while waiting for buffer latch type 2 for page (1:3564879), database ID 7.
Run Code Online (Sandbox Code Playgroud)

奇怪的是,没有带有Idof 的数据库7
Maximum Idsys.databases目录视图中是 6。(请记住,DROP还原操作之前的所有数据库作业,除了dba_utilityId=5。新还原的数据库分配的 ID 为 6。)

生产环境为2008 R2,测试环境为2012 SP1。

这可能是什么原因造成的?

sql-server-2008-r2 sql-server-2012 dbcc-checkdb

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

寻求有关扩展事件行为的帮助

我正在使用扩展事件来跟踪服务器上正在执行的过程及其执行程序的主机名。

我使用了以下 XE 脚本:

CREATE EVENT SESSION [EXEC_SP] ON SERVER 
ADD EVENT sqlserver.sp_statement_completed
(
  SET collect_statement=(0)
  ACTION
  (
    sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,
    sqlserver.nt_username,sqlserver.server_instance_name,
    sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,
    sqlserver.transaction_id,sqlserver.username
  )
  WHERE ( [sqlserver].[is_system]=(0))
)
 ADD TARGET package0.asynchronous_file_target
 (
   SET FILENAME = N'C:\EXEC_SP.xel',
   METADATAFILE = N'C:\EXEC_SP.xem'
 )
 WITH
 (
   MAX_MEMORY=4096KB,
   EVENT_RETENTION_MODE=NO_EVENT_LOSS,
   MAX_DISPATCH_LATENCY=15 SECONDS,
   TRACK_CAUSALITY=OFF,
    STARTUP_STATE=ON
 );
Run Code Online (Sandbox Code Playgroud)

但是,正在执行的过程主体内的每个语句都在目标处构成一行。

例如,如果我的程序主体中有 5 个语句,则该事件将被触发 5 次,并且在目标处将有 5 个不同的条目对应于相同的条目。

我只为每个正在执行的过程寻找一个条目,而不是多个条目。

也就是说,正在执行的每个过程都应该只构成 1 行而不是多行。

如何解决这个问题?

sql-server extended-events sql-server-2012

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