当我们使用GROUP BY和HAVING与WHERE子句时,我只是混淆了SQL查询的执行顺序.先执行哪一个?什么是序列?
我见过的每个SQL Server连接字符串都是这样的:
Data Source=MyLocalSqlServerInstance;Initial Catalog=My Nifty Database;
Integrated Security=SSPI;
Run Code Online (Sandbox Code Playgroud)
我是否需要初始目录设置?(显然不是,因为我正在处理的应用似乎没有它.)
那么,那是什么呢?
database sql-server connection-string database-connection sql-server-2005
我们在Stack Overflow SQL Server 2005数据库中看到了一些有害但罕见的死锁条件.
我附上了探查器,使用这篇关于解决死锁问题的优秀文章设置了一个跟踪配置文件,并捕获了一堆示例.奇怪的是,死锁写入始终是相同的:
UPDATE [dbo].[Posts]
SET [AnswerCount] = @p1, [LastActivityDate] = @p2, [LastActivityUserId] = @p3
WHERE [Id] = @p0
Run Code Online (Sandbox Code Playgroud)
另一个死锁声明各不相同,但它通常是对posts表的一些简单,简单的读取.这个人总是在僵局中被杀死.这是一个例子
SELECT
[t0].[Id], [t0].[PostTypeId], [t0].[Score], [t0].[Views], [t0].[AnswerCount],
[t0].[AcceptedAnswerId], [t0].[IsLocked], [t0].[IsLockedEdit], [t0].[ParentId],
[t0].[CurrentRevisionId], [t0].[FirstRevisionId], [t0].[LockedReason],
[t0].[LastActivityDate], [t0].[LastActivityUserId]
FROM [dbo].[Posts] AS [t0]
WHERE [t0].[ParentId] = @p0
Run Code Online (Sandbox Code Playgroud)
要非常清楚,我们没有看到写/写死锁,而是读/写.
我们目前混合使用LINQ和参数化SQL查询.我们已添加with (nolock)到所有SQL查询中.这可能对一些人有所帮助.我们昨天修复了一个(非常)写得不好的徽章查询,每次运行时间超过20秒,每分钟运行一次.我希望这是一些锁定问题的根源!
不幸的是,我在大约2小时前遇到了另一个死锁错误.同样的症状,同样的罪魁祸首写.
真正奇怪的是,您在上面看到的锁定写入SQL语句是非常特定的代码路径的一部分.它仅在向问题添加新答案时执行 - 它使用新答案计数和最后日期/用户更新父问题.显然,这与我们正在进行的大量读取相比并不常见!据我所知,我们在应用程序的任何地方都没有进行大量的写操作.
我意识到NOLOCK是一个巨大的锤子,但我们在这里运行的大多数查询都不需要那么准确.如果您的用户个人资料已过期几秒,您会关心吗?
正如Scott Hanselman在这里讨论的那样,将NOLOCK与Linq一起使用有点困难.
我们正在调整使用的想法
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Run Code Online (Sandbox Code Playgroud)
在基本数据库上下文中,以便我们所有的LINQ查询都有此设置.没有它,我们必须在3-4行事务代码块中包装我们所做的每个LINQ调用(好吧,简单的读取,这是绝大多数),这很难看.
我想我有点沮丧的是,SQL 2005中的琐碎读取可能会使写入死锁.我可以看到写/写死锁是一个很大的问题,但 …
如何在T-SQL中将字符串转换为日期?
我的测试用例是字符串: '24.04.2012'
如何在一定范围内查询DateTime数据库字段?
我正在使用SQL SERVER 2005
错误代码如下
SELECT *
FROM TABLENAME
WHERE DateTime >= 12/04/2011 12:00:00 AM
AND DateTime <= 25/05/2011 3:53:04 AM
Run Code Online (Sandbox Code Playgroud)
请注意,我需要在特定时间范围内获取行.例如,10分钟的时间范围.
目前SQL返回"12"附近的语法不正确."
当我尝试在游标循环中运行以下SQL代码段时,
set @cmd = N'exec sp_rename ' + @test + N',' +
RIGHT(@test,LEN(@test)-3) + '_Pct' + N',''COLUMN'''
Run Code Online (Sandbox Code Playgroud)
我收到以下消息,
消息15248,级别11,状态1,过程sp_rename,行213
参数@objname不明确或声明@objtype(COLUMN)错误.
有什么问题,我该如何解决?我尝试用括号括起列名[],并""像一些建议的搜索结果一样加双引号.
编辑1 -
这是整个脚本.如何将表名传递给重命名sp?我不知道如何做到这一点,因为列名在许多表之一.
BEGIN TRANSACTION
declare @cnt int
declare @test nvarchar(128)
declare @cmd nvarchar(500)
declare Tests cursor for
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE 'pct%' AND TABLE_NAME LIKE 'TestData%'
open Tests
fetch next from Tests into @test
while @@fetch_status = 0
BEGIN
set @cmd = N'exec sp_rename ' + @test …Run Code Online (Sandbox Code Playgroud) 有谁知道MARS(多个活动结果集)的任何缺点?有没有人知道为什么人们应该避免使用MARS,比如游标比MARS更有用的情况.
我有一个.net事务与SQL插入到SQL Server 2005数据库.该表具有标识主键.
当事务中发生错误时,将Rollback()被调用.行插入正确回滚,但是下次将数据插入表时,标识会增加,就好像回滚从未发生过一样.所以基本上在身份序列中存在差距.有没有办法让Rollback()方法回收丢失的身份?
我没有以正确的方式接近这个吗?
我使用的是隔离级别的Microsoft SQL Server 2005数据库READ_COMMITTED和READ_COMMITTED_SNAPSHOT=ON.
现在我想用:
SELECT * FROM <tablename> FOR UPDATE
Run Code Online (Sandbox Code Playgroud)
...以便在尝试访问同一行"FOR UPDATE"时阻止其他数据库连接.
我试过了:
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
Run Code Online (Sandbox Code Playgroud)
...但是即使选择"1"以外的ID,这也会阻止所有其他连接.
SELECT FOR UPDATE对于Oracle,DB2,MySql而言,这是正确的提示吗?
编辑2009-10-03:
这些是创建表和索引的语句:
CREATE TABLE example ( Id BIGINT NOT NULL, TransactionId BIGINT,
Terminal BIGINT, Status SMALLINT );
ALTER TABLE example ADD CONSTRAINT index108 PRIMARY KEY ( Id )
CREATE INDEX I108_FkTerminal ON example ( Terminal )
CREATE INDEX I108_Key ON example ( TransactionId )
Run Code Online (Sandbox Code Playgroud)
很多并行进程都这样做SELECT:
SELECT * …Run Code Online (Sandbox Code Playgroud) sql t-sql sql-server sql-server-2005 read-committed-snapshot
我有一个我正在查询的视图,看起来像这样:
Run Code Online (Sandbox Code Playgroud)BuildingName PollNumber ------------ ---------- Foo Centre 12 Foo Centre 13 Foo Centre 14 Bar Hall 15 Bar Hall 16 Baz School 17
我需要编写一个将BuildingNames组合在一起的查询,并显示一个PollNumbers列表,如下所示:
Run Code Online (Sandbox Code Playgroud)BuildingName PollNumbers ------------ ----------- Foo Centre 12, 13, 14 Bar Hall 15, 16 Baz School 17
我怎么能在T-SQL中做到这一点?我宁愿不为此写一个存储过程,因为它看起来有点矫枉过正,但我不是一个数据库人.看起来像SUM()或AVG()这样的聚合函数是我需要的,但我不知道T-SQL是否有一个.我正在使用SQL Server 2005.
t-sql sql-server group-by sql-server-2005 aggregate-functions
sql-server-2005 ×10
sql-server ×6
t-sql ×5
sql ×4
.net ×1
database ×1
deadlock ×1
group-by ×1
transactions ×1