小编Han*_*non的帖子

使用 Case 语句检查约束

如果列的输入值大于 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)

sql-server-2008 sql-server check-constraints

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

索引过多的表怎么办?

我是这家公司的新 DBA。我看到他们的一些表有很多索引;例如,有些超过 50 或 60。

这是一件好事吗?从我的研究来看,这似乎对性能不利。

你会如何处理这个?

我想删除所有索引并从 0 开始。我认为开发人员一直在使用 Tuning Advisor 并没有真正了解索引。

index sql-server-2008 sql-server

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

收缩事务日志文件时偶尔会出错

我有一个每小时运行一次的事务备份作业。

首先它将数据库日志备份到另一个驱动器,然后缩小日志并删除旧.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.

为什么会这样?

有没有更好的方法来备份和收缩数据库日志?

sql-server-2008 sql-server maintenance

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

选择日期范围为当前年份减去 #years 的记录

我想从比当前年份减去“x”年之前的时间点选择并最终删除记录。

我不确定最有效的方法来做到这一点。

oracle

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

如何将 varchar 值列表插入到单列表中?

在 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)

sql-server-2005 sql-server insert

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

SQL Server - 从子查询/派生表中删除

有没有办法可以把下面的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 …

sql-server

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

根据 15 分钟的间隔获取计数

我有一个包含通话记录的表:

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)

sql-server sql-server-2008-r2 count date

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

日期时间聚集索引不断变得碎片化

我有一个名为 CDR 的大表(400 万条记录),用于在 VoIP 系统中存储来自 Cisco 路由器的 CDR(呼叫详细记录),该表不断增长,并且永远不会有无序插入的记录。我们也不更新或删除行。

由于我们的大多数查询都基于发起呼叫的时间,因此我在此列(DATETIME数据类型)上创建了我的主要聚集索引。然而,在短暂的时间后,索引变得碎片化,仅仅一周后,它的碎片化程度就超过了 70%,因此我们需要重建它。我不明白为什么会发生这种情况,因为我们按顺序插入,并且不更新或删除行。

任何减少或消除碎片的建议将不胜感激。

我在装有 Windows Server 2012 的旧 Xenon 服务器上使用 SQL Server 2014 Enterprise 版本。

sql-server clustered-index fragmentation datetime sql-server-2014

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

更改 SQL Server 中的分区列

我创建了一个包含 100 多万行的分区表,并datetime在创建表时不小心将错误的列指定为分区键。

是否有一种简单的方法可以将分区列从一datetime列更改为另一列。就我而言,我们有一个列InsertedDate和一个CompleteDate,我不小心使用了第一个而不是第二个。

sql-server partitioning sql-server-2012

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

获取价格介于 100000 和 10000000 之间的所有数据

我有一个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 <= 100000Price 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)

mysql mysql-5.6

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