对于INSERT,UPDATE和DELETESQL直接对数据库执行的语句,大多数数据库提供商返回受影响的行数.对于存储过程,受影响的记录数始终为-1.
我们如何获得受存储过程影响的记录数?
比较这两个查询.将过滤器放在连接条件或are子句中是否更快.我一直认为它在连接标准上更快,因为它在最快的时刻减少了结果集,但我不确定.
我将构建一些测试来查看,但我也希望得到关于哪个更清晰易读的意见.
查询1
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
INNER JOIN TableB b
ON x.TableBID = b.ID
WHERE a.ID = 1 /* <-- Filter here? */
Run Code Online (Sandbox Code Playgroud)
查询2
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
AND a.ID = 1 /* <-- Or filter here? */
INNER JOIN TableB b
ON x.TableBID = b.ID
Run Code Online (Sandbox Code Playgroud)
编辑
我运行了一些测试,结果显示它实际上非常接近,但该WHERE条款实际上稍快一点!=)
我绝对同意在WHERE条款上应用过滤器更有意义,我只是对性能影响感到好奇.
已确认的时间标准: 143016 ms
已安排时间加入标准: 143256 ms
测试
SET …Run Code Online (Sandbox Code Playgroud) 我有一个来自MySQL转储的.sql文件,其中包含要插入这些表中的表,定义和数据.如何将转储文件中表示的此数据库转换为MS SQL Server数据库?
我需要一个SQL语句来大写每个单词的第一个字母.其他字符必须是小写.
这些话可以是这样的:
wezembeek-oppem
roeselare
BRUGGE
louvain-la-neuve
Run Code Online (Sandbox Code Playgroud)
必须是:
Wezembeek-Oppem
Roeselare
Brugge
Louvain-La-Neuve
Run Code Online (Sandbox Code Playgroud)
这应该是UPDATE语句,我想更新列的数据.非常感谢你提前给出的答案,我是一个SQL新手.
我使用SQL Server 2014 Express创建了一个示例数据库,并将其添加到我的Windows窗体解决方案中.双击它打开我得到这个错误.
无法打开数据库,因为它是版本782.此服务器支持版本706及更早版本.不支持降级路径
我正在使用Visual Studio 2013.我真的不明白我使用的是两个最新版本的Microsoft产品,它们是不兼容的.我错过了什么吗?我该如何打开这个数据库?

我有一些客户收到奇怪的账单.我能够找出核心问题:
SELECT 199.96 - (0.0 * FLOOR(CAST(1.0 AS DECIMAL(19, 4)) * CAST(199.96 AS DECIMAL(19, 4)))) -- 200 what the?
SELECT 199.96 - (0.0 * FLOOR(1.0 * CAST(199.96 AS DECIMAL(19, 4)))) -- 199.96
SELECT 199.96 - (0.0 * FLOOR(CAST(1.0 AS DECIMAL(19, 4)) * 199.96)) -- 199.96
SELECT 199.96 - (CAST(0.0 AS DECIMAL(19, 4)) * FLOOR(CAST(1.0 AS DECIMAL(19, 4)) * CAST(199.96 AS DECIMAL(19, 4)))) -- 199.96
SELECT 199.96 - (CAST(0.0 AS DECIMAL(19, 4)) * FLOOR(1.0 * CAST(199.96 AS DECIMAL(19, 4)))) -- 199.96 …Run Code Online (Sandbox Code Playgroud) 我们在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中的琐碎读取可能会使写入死锁.我可以看到写/写死锁是一个很大的问题,但 …
使用SQL Server读取最后一行的最有效方法是什么?
该表在唯一键上编制索引 - "底部"键值表示最后一行.
假设我有一个客户地址表:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
Run Code Online (Sandbox Code Playgroud)
在表中,像John Smith这样的客户可以拥有多个地址.我需要这个表的select查询只返回在'CName'中有重复项的第一行.对于这个表,它应该返回除第3个(或第1个)之外的所有行 - 这两个地址中的任何一个都可以,但只能返回一个.是否有一个关键字我可以根据服务器之前是否已经看过列值来添加到SELECT查询中进行过滤?
TABLE可以具有没有聚簇索引的主键吗?
并且TABLE可以在没有主键的情况下具有聚簇索引吗?
有人可以简单地告诉我主键和聚簇索引的关系吗?