我有一个大型报告,我在sql server上运行.运行需要几分钟.我不希望用户点击两次运行.由于我在事务中包装整个过程,如何检查表是否被事务锁定?如果是这样,我想返回一条错误消息,说"生成报告,请在几分钟后重试".
如何实现这一目标?
有人可以用简单的英文向我解释一个视图的索引是如何工作的吗?我对表上的索引有一个相当简单的理解; 索引视图的工作方式与仅让底层表上的索引自然地完成它们的工作方式有何不同?
我使用Entity Framework来访问我的SQL数据.我在数据库模式中有一些约束,我想知道如何处理由这些约束引起的异常.
例如,在两个用户尝试同时向DB添加(几乎)相同的实体的情况下,我得到以下异常.
System.Data.UpdateException
"An error occurred while updating the entries. See the InnerException for details."
(inner exception) System.Data.SqlClient.SqlException
"Violation of UNIQUE KEY constraint 'Unique_GiftId'. Cannot insert duplicate key in object 'dbo.Donations'.\r\nThe statement has been terminated."
Run Code Online (Sandbox Code Playgroud)
如何正确捕获此特定异常?
脏的解决方案:
catch (UpdateException ex)
{
SqlException innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Message.StartsWith("Violation of UNIQUE KEY constraint 'Unique_GiftId'"))
{
// handle exception here..
}
else
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
现在虽然这种方法有效,但它有一些缺点:
你知道更好的解决方案吗?感谢所有反馈..
注意:我不想在应用程序层中手动编写约束,我想将它们放在数据库中.
sql sql-server entity-framework constraints unique-constraint
如果我运行Profiler,那么它会建议很多像这样的索引
CREATE CLUSTERED INDEX [_dta_index_Users_c_9_292912115__K1] ON [dbo].[Users]
(
[UserId] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF,
ONLINE = OFF) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
UserId是表Users的主键.该索引是否比表中已有的索引更好:
ALTER TABLE [dbo].[Users] ADD CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud) 如果表格包含超过700,000行,则确定项目是否存在的性能最佳
if (Select count(id) from Registeration where email='email@w.cn') > 0
print 'Exist'
else
print 'Not Exist'
Run Code Online (Sandbox Code Playgroud)
要么
if Exists(Select id from Registeration where email='email@w.cn')
print 'Exist'
else
print 'Not Exist'
Run Code Online (Sandbox Code Playgroud) 我创建了2个表,另外1个用外键创建了另外两个表.
我意识到我想对第3号表做一些改动.
我尝试更新字段,但收到错误"不允许保存更改.您所做的更改需要删除并重新创建下表."
我删除了这两个关系但是当我查看依赖关系时,我看到我的表仍然依赖于那些2,我仍然无法对其进行任何更改.
我能做什么?
有没有办法在SQL Server 2008中找到函数的用法?
SQL Server中有批量删除的解决方案吗?
我不能使用TRUNCATE,因为我想使用WHERE来限制行中的行.
是否有类似批量复制(bcp)的删除数据?
有没有更好的方法来合并重叠的日期间隔?
我提出的解决方案非常简单,现在我想知道其他人是否能更好地了解如何做到这一点.
/***** DATA EXAMPLE *****/
DECLARE @T TABLE (d1 DATETIME, d2 DATETIME)
INSERT INTO @T (d1, d2)
SELECT '2010-01-01','2010-03-31' UNION SELECT '2010-04-01','2010-05-31'
UNION SELECT '2010-06-15','2010-06-25' UNION SELECT '2010-06-26','2010-07-10'
UNION SELECT '2010-08-01','2010-08-05' UNION SELECT '2010-08-01','2010-08-09'
UNION SELECT '2010-08-02','2010-08-07' UNION SELECT '2010-08-08','2010-08-08'
UNION SELECT '2010-08-09','2010-08-12' UNION SELECT '2010-07-04','2010-08-16'
UNION SELECT '2010-11-01','2010-12-31' UNION SELECT '2010-03-01','2010-06-13'
/***** INTERVAL ANALYSIS *****/
WHILE (1=1) BEGIN
UPDATE t1 SET t1.d2 = t2.d2
FROM @T AS t1 INNER JOIN @T AS t2 ON
DATEADD(day, 1, t1.d2) BETWEEN …Run Code Online (Sandbox Code Playgroud) 什么被认为是SQL Server中的会话.我正在尝试使用sp_getapplock,文档说明:
放置在资源上的锁与当前事务或当前会话相关联.当事务提交或回滚时,将释放与当前事务关联的锁.在会话注销时释放与会话关联的锁.当服务器因任何原因关闭时,将释放所有锁.
'会话退出时释放与会话关联的锁'.
我需要知道什么是会话.使用管理工作室连接是数据库的会话; 使用asp.net连接到sql server也会创建一个会话.
如果我使用ADO .net和连接池,连接池中的每个连接都被视为不同的会话,该怎么办?
sql-server ×9
sql ×7
t-sql ×4
constraints ×2
indexing ×2
concurrency ×1
indexed-view ×1
locking ×1
performance ×1
primary-key ×1
ssms ×1
views ×1