我有两个示例查询(如下所示)。两者(删除和)都在其中创建一个数据库和一个分区表。该表有几个分区,每个分区都有数据(包括最后一个,无界的,一个)。分区数据从 1 到 3996。
然后每个脚本添加一个新分区。新分区从 4000 开始。
在第一个脚本中,事务日志显示最后一个分区(分区 4)中的每条记录都被删除并重新插入。
第二个脚本显示没有发生行的活动(没有删除和插入)。
在只有两个脚本之间的区别是RANGE LEFTVSRANGE RIGHT的分区函数。 RANGE RIGHT导致不删除或插入,RANGE LEFT导致最后一个分区中的所有行被删除和重新插入。
我想RANGE LEFT或RANGE RIGHT只是控制边界值是否与左侧或右侧分区一致。但它显然也做了其他事情。
是否有更多的RANGE LEFT和RANGE 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) 当我浏览 DBA-Reactions 时,我几乎理解了所有的 .gif,但是使用这个我遇到了麻烦:
https://twitter.com/DBAReactions/status/613840893322338304
我的意思是 truncate 显然不会像批量删除那样创建事务日志,但仍然存在您非常确定可以简单地截断完整表的情况。除此之外还有其他的顾虑吗?所以基本上我很想了解完全不同。
我想删除与一组特定数据库相关的所有作业。
因此,我已将所有名称添加到表变量中,并尝试生成脚本以删除作业。
我怎样才能做到这一点?
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
我有一个表作为这个例子:
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)
知道如何构建一个查询吗?
我有 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) 我有一张包含付款信息的表格,如下所示:
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。
我尝试collation_name在sys.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 行对系统目录进行临时更新。
sys.tables 列出单个数据库中的所有用户表,但没有它们的架构名称。
如果我在创建代码时知道现有数据库,我可以使用它USE来浏览所有数据库,查询sys.tables其表,并将列表插入到临时表中以供以后使用。
但是,有没有更简单的方法来做到这一点,并且通过唯一的查询能够从所有用户数据库中检索所有用户表及其架构?
我有一个测试环境,我在其中安排了运行还原测试和 DBCC 检查的作业。这些作业运行到:
1)从产品复制数据库备份。
2)DROP除dba_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 Id在sys.databases目录视图中是 6。(请记住,DROP还原操作之前的所有数据库作业,除了dba_utility其Id=5。新还原的数据库分配的 ID 为 6。)
生产环境为2008 R2,测试环境为2012 SP1。
这可能是什么原因造成的?
我正在使用扩展事件来跟踪服务器上正在执行的过程及其执行程序的主机名。
我使用了以下 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-2012 ×10
sql-server ×8
select ×2
collation ×1
dbcc-checkdb ×1
dml ×1
partitioning ×1
t-sql ×1
trigger ×1
truncate ×1
unicode ×1