我知道我们倾向于不惜一切代价避免在 SQL Server 中使用游标和循环,但是在哪些情况下您绝对需要过程查询,而基于集合的查询不会给您结果?
我了解两者之间的区别,我只是从未遇到过需要使用游标的情况。我想知道是否有这样的情况。
当我插入表使用INSTEAD OF触发器,@@Identity,IDENT_CURRENT('Table')并SCOPE_IDENTITY()返回null。如何获取插入行的最后一个标识?
我只是想确保我在这些概念的正确轨道上,所以任何反馈都将不胜感激。
这是我刚刚优化的查询的理论,通过反复试验和阅读 MSDN 文档的过程。
查询
DECLARE @pic_id int
SET pic_id = 1
SELECT ROW_NUMBER() OVER (ORDER BY pic_date desc) AS row_num, *
FROM tbl_pics
WHERE deleted = 0 AND map_id = 1 AND (hidden = 0 OR pic_id = @pic_id)
Run Code Online (Sandbox Code Playgroud)
指数
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
Run Code Online (Sandbox Code Playgroud)
pic_id上还有一个PK索引
理论
键列是这样,因为它们用于 WHERE 子句(但不用于 OR 情况)或 ORDER BY。
非键 (INCLUDE) 列也是如此,因为它们在 WHERE 中使用,但因为它们用于 OR 场景,它们不能(不能 = 不会提高性能)成为键列。
这些假设正确吗?如果没有,我错过了什么?
谢谢!
我已经将我的代码分类为“连贯块”,我可以一遍又一遍地将其插入到更长的“配置脚本”中,我正在使用的模式之一是:
CREATE TABLE #WidgetSetting
(
WidgetID bigint not null,
Name nvarchar(100) not null,
Value nvarchar(max) not null,
CreateDate datetime not null
)
INSERT VALUES
MERGE TABLES
DROP TABLE #WidgetSetting
Run Code Online (Sandbox Code Playgroud)
但是现在 SSMS 抱怨该对象在下次CREATE TABLE火灾时已经存在。是什么赋予了?
我认为很明显我将不得不在脚本的开头声明一次表,截断而不是删除,但很自然地,无法删除表并再次使用相同的名称。
我发现一些 SP(存储过程)写成,
CREATE PROCEDURE [dbo].[XXX]
(
-- Parameters
)
BEGIN
--- Actual Work
END
Run Code Online (Sandbox Code Playgroud)
还有一些作为
CREATE PROCEDURE [dbo].[XXX]
(
-- Parameters
)
--- Actual Work
Run Code Online (Sandbox Code Playgroud)
是什么让它与众不同?
我希望这个问题很简单,我目前正在将一些脚本继承到我的项目中,由数据库管理员审查。显然以前从未这样做过,并且发现了很多问题。
我对此有点陌生,但我对 Sargable 和 Non-Sargable SQL 的理解是,违规函数正在列上运行,从而阻碍索引(假设存在索引),从而导致扫描列和性能受到打击。代码在输入中有几个函数,很多次要的东西,比如
Where a.date between 'inputdate' and dateadd(day,1,'inputdate')
Run Code Online (Sandbox Code Playgroud)
DBA 采取的立场是,任何在WHERE子句中包含函数的查询都是不可复制的。我将放弃与他的问题,因为除了生气的管理员和我的访问受限之外,争论会让我无处可去。
但是为了知识起见,是否存在他是正确的并且WHERE从句中出现的任何功能都是问题的情况,无论功能或位置如何?
我有一个从应用程序中使用的大视图。我想我已经缩小了我的性能问题,但我不确定如何解决它。视图的简化版本如下所示:
SELECT ISNULL(SEId + '-' + PEId, '0-0') AS Id,
*,
DATEADD(minute, Duration, EventTime) AS EventEndTime
FROM (
SELECT se.SEId, pe.PEId,
COALESCE(pe.StaffName, se.StaffName) AS StaffName, -- << Problem!
COALESCE(pe.EventTime, se.EventTime) AS EventTime,
COALESCE(pe.EventType, se.EventType) AS EventType,
COALESCE(pe.Duration, se.Duration) AS Duration,
COALESCE(pe.Data, se.Data) AS Data,
COALESCE(pe.Field, se.Field) AS Field,
pe.ThisThing, se.OtherThing
FROM PE pe FULL OUTER JOIN SE se
ON pe.StaffName = se.StaffName
AND pe.Duration = se.Duration
AND pe.EventTime = se.EventTime
WHERE NOT(pe.ThisThing = 1 AND se.OtherThing = 0)
) Z …Run Code Online (Sandbox Code Playgroud) 我正在运行 SQL Server 2012
SELECT
0.15 * 30 / 360,
0.15 / 360 * 30
Run Code Online (Sandbox Code Playgroud)
结果:
0.012500,
0.012480
Run Code Online (Sandbox Code Playgroud)
这个对我来说更令人困惑:
DECLARE @N INT = 360
DECLARE @I DECIMAL(38,26) = 0.15 * 30 / 360
DECLARE @C DECIMAL(38,26) = 1000000
SELECT @C * @I * POWER(1 + @I, @N) / ( POWER(1 + @I, @N) - 1 )
SELECT @C * (@I * POWER(1 + @I, @N) / ( POWER(1 + @I, @N) - 1 ) )
Run Code Online (Sandbox Code Playgroud)
第一个选择给了我正确的结果:12644.44022 第二个截断结果:12644.00000
我的公司正在努力实施一个新的 HR 应用程序,以统一我们现有的 HR 流程。不过,我们遇到了一些症结;根据业务规则,Employee表的EmployeeID和SupervisorID列不能为空。但是,应用程序要求这些列可以为空,并且不会在将列设置为不允许为空时同步这些列。
建议的解决方案是创建一个视图,其中架构似乎允许列中存在空值,同时保留表以防止它们被输入到数据中。我并不完全相信这是可能的,而且我一直无法找到一种方法来做到这一点。这可能吗?如果没有,处理这种情况的最佳方法是什么?
我最近加入了一家公司,我刚刚注意到许多存储过程都有相同的代码段重复。我注意到是因为我的任务是在它发生的每个 SP 中更改该代码的一小部分:)
这是一段相当大的代码,大约 30 行。该代码是插入语句的一部分,它基本上将 4 个表与WHERE/AND从 SP 到 SP 并没有真正改变的条件连接在一起。它看起来类似于下图:
...
...
FROM <TableOne>
INNER JOIN <TableTwo> ON ...
AND .....
AND .....
LEFT JOIN <TableThree> ON ...
AND .....
AND .....
WHERE .....
AND .....
AND .....
AND MedicalPlanCode IN ('abc', 'def', 'ghi')
Run Code Online (Sandbox Code Playgroud)
唯一从 SP 更改为 SP 的部分是值('abc', 'def', 'ghi')
这些值的数量也可能不同,因此某些 SP 将具有 2 个值,其他 SP 将具有 5 个,等等......
我想到的一切都将那部分代码更改为动态 SQL,我不确定这是否值得。然而,我的程序员讨厌这种情况。
我应该尝试实现某种形式的代码重用吗?它会有投资回报率吗?我有哪些选择?我不得不经历大约 100 个存储过程,大约需要一个小时。
这 100 个 SP 分布在 20 个左右不同的数据库中。我确实有权创建视图。
sql-server ×10
t-sql ×10
cursors ×1
decimal ×1
identity ×1
index ×1
optimization ×1
performance ×1
ssms ×1
subquery ×1
trigger ×1