如果列的输入值大于 3,我想在列上添加一个检查约束,而不应将其保存为 1 个其他输入值。对于这种情况,我使用下面的查询,但在插入数据时显示错误消息。
create table tblTestCheckConstraint
(
id int,
NewColumn int
)
alter table tblTestCheckConstraint
add constraint chk_tblTestCheckConstraint_NewColumn1 CHECK
(
CASE
WHEN NewColumn >4 THEN 1
ELSE NewColumn
END = 1
)
Run Code Online (Sandbox Code Playgroud)
插入语句:
insert into tblTestCheckConstraint values ( 1,5)
insert into tblTestCheckConstraint values ( 1,2)
Run Code Online (Sandbox Code Playgroud)
错误信息:
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "chk_tblTestCheckConstraint_NewColumn1". The conflict occurred in database "DBName"
, table "dbo.tblTestCheckConstraint", column 'NewColumn'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud) 我是这家公司的新 DBA。我看到他们的一些表有很多索引;例如,有些超过 50 或 60。
这是一件好事吗?从我的研究来看,这似乎对性能不利。
你会如何处理这个?
我想删除所有索引并从 0 开始。我认为开发人员一直在使用 Tuning Advisor 并没有真正了解索引。
我有一个每小时运行一次的事务备份作业。
首先它将数据库日志备份到另一个驱动器,然后缩小日志并删除旧.trn文件。

中间任务使用以下代码缩小日志文件:
USE myDB
DBCC SHRINKFILE('myDB_LOG', 0, TRUNCATEONLY)
Run Code Online (Sandbox Code Playgroud)
但是,有时我会收到以下错误。
说明:执行查询“USE myDB DBCC SHRINKFILE('myDB_LOG'...”失败并出现以下错误:“备份、文件操作操作(例如 ALTER DATABASE ADD FILE)和数据库上的加密更改必须序列化。重新发出当前备份或文件操作操作完成后的语句。将数据库上下文更改为“myDB”。”。可能的失败原因:查询问题、“ResultSet”属性设置不正确、参数设置不正确或连接未正确建立。 End Error DTExec: The package execution returns DTSER_FAILURE (1). Started: 22:00:19 Finished: 22:04:17 Elapsed: 238.26 seconds. The package execution failed. The step failed.
为什么会这样?
有没有更好的方法来备份和收缩数据库日志?
我想从比当前年份减去“x”年之前的时间点选择并最终删除记录。
我不确定最有效的方法来做到这一点。
在 SQL Server 2005 中:
CREATE TABLE __RADHE
(
itemNo varchar(10) not null primary key clustered
);
GO
INSERT INTO __RADHE ???
'34926840', '34927020', '34927202', '34927384', '34927566',
'34927830', '34927889', '34930743', '34930750', '34927897',
'34927848', '34927574', '34927392', '34927210', '34927038',
'34926857', '34917120', '34917286', '34917443', '34926865',
'34927046', '34927228', '34927400', '34927582', '34927855',
'34927905', '34930768', '34930776', '34927913', '34927863',
'34927590', '34927418', '34927236', '34927053', '34926873',
'34917450', '34917294', '34917138', '34917146', '34917302',
'34917468', '34926881', '34927061', '34927244', '34927426',
'34927608', '34927871', '34927921', '34930784', '34927616',
'34927434', '34927251', '34927079', '34926899', '34917476',
'34917310', '34917153', '34917161', …Run Code Online (Sandbox Code Playgroud) 有没有办法可以把下面的SELECT语句变成一个DELETE?
I would like to delete the corresponding returned records from the [ETL].[Stage_Claims] table.
Since I used derived tables I can't reference the Stage_Claims table.
To summarize, the 2 physical tables used in the below query have identical structures. Only difference is DUPS_Claims is a subset of Stage_Claims.
DUPS_Claims contains duplicate records found in Stage_Claims. If a record exists 3 times in Stage_Claims, we will have that record 3 times in DUPS_Claims as …
我有一个包含通话记录的表:
tbl_calls
cl_Id
cl_StartDate
cl_endDate
Run Code Online (Sandbox Code Playgroud)
我传递两个参数@StartDate并@EndDate给我的存储过程。
我的要求是在每 15 分钟的持续时间内获取通话记录的数量。
例如,如果:
@StartDate = '2015-11-16 00:00:00.000',
@EndDate = '2015-11-16 23:59:00.000'
Run Code Online (Sandbox Code Playgroud)
输出应该是:
Date Count
2015-11-16 00:00:00.000 10(Count of startDate between '2015-11-16 00:00:00.000' AND '2015-11-16 00:15:00.000')
2015-11-16 00:15:00.000 7(Count of startDate between '2015-11-16 00:15:00.000' AND '2015-11-16 00:30:00.000')
2015-11-16 00:30:00.000 50(Count of startDate between '2015-11-16 00:30:00.000' AND '2015-11-16 00:45:00.000')
upto @EndDate
Run Code Online (Sandbox Code Playgroud)
我已经尝试了以下查询,但它不能正常工作。有一个更好的方法吗?
DECLARE @StartDate DATETIME = DATEADD(DAY,-1,GETUTCDATE()),
@EndDate DATETIME = GETUTCDATE()
SELECT New
FROM
(SELECT
(CASE
WHEN cl_StartTime BETWEEN @StartDate AND …Run Code Online (Sandbox Code Playgroud) 我有一个名为 CDR 的大表(400 万条记录),用于在 VoIP 系统中存储来自 Cisco 路由器的 CDR(呼叫详细记录),该表不断增长,并且永远不会有无序插入的记录。我们也不更新或删除行。
由于我们的大多数查询都基于发起呼叫的时间,因此我在此列(DATETIME数据类型)上创建了我的主要聚集索引。然而,在短暂的时间后,索引变得碎片化,仅仅一周后,它的碎片化程度就超过了 70%,因此我们需要重建它。我不明白为什么会发生这种情况,因为我们按顺序插入,并且不更新或删除行。
任何减少或消除碎片的建议将不胜感激。
我在装有 Windows Server 2012 的旧 Xenon 服务器上使用 SQL Server 2014 Enterprise 版本。
sql-server clustered-index fragmentation datetime sql-server-2014
我创建了一个包含 100 多万行的分区表,并datetime在创建表时不小心将错误的列指定为分区键。
是否有一种简单的方法可以将分区列从一datetime列更改为另一列。就我而言,我们有一个列InsertedDate和一个CompleteDate,我不小心使用了第一个而不是第二个。
我有一个articles名为price.
当我的 Web 应用程序上的用户同时选择Price Min和 时Price Max,我需要执行如下查询:
$priceMin = 100000;
$priceMax = 10000000;
$query = 'SELECT * FROM articles WHERE price BETWEEN $priceMin AND $priceMax';
Run Code Online (Sandbox Code Playgroud)
然而,当所选择的Price Min is <= 100000和Price Max is >= 10000000(10元),我没有与任何输出Price大于900000即使以上值的行900000确实存在。
该表定义如下:
CREATE TABLE articles (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
price varchar(100) NOT NULL,
source varchar(255) NOT NULL, PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 …Run Code Online (Sandbox Code Playgroud) sql-server ×8
count ×1
date ×1
datetime ×1
index ×1
insert ×1
maintenance ×1
mysql ×1
mysql-5.6 ×1
oracle ×1
partitioning ×1