标签: t-sql

什么时候绝对需要程序查询?

我知道我们倾向于不惜一切代价避免在 SQL Server 中使用游标和循环,但是在哪些情况下您绝对需要过程查询,而基于集合的查询不会给您结果?

我了解两者之间的区别,我只是从未遇到过需要使用游标的情况。我想知道是否有这样的情况。

sql-server t-sql cursors

8
推荐指数
2
解决办法
624
查看次数

如何在使用而不是触发器时插入最后一个标识行

当我插入表使用INSTEAD OF触发器,@@IdentityIDENT_CURRENT('Table')SCOPE_IDENTITY()返回null。如何获取插入行的最后一个标识?

trigger sql-server-2008 sql-server t-sql identity

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

非聚集索引 - 键和非键

我只是想确保我在这些概念的正确轨道上,所以任何反馈都将不胜感激。

这是我刚刚优化的查询的理论,通过反复试验和阅读 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 场景,它们不能(不能 = 不会提高性能)成为键列。

这些假设正确吗?如果没有,我错过了什么?

谢谢!

index sql-server-2008 sql-server t-sql

8
推荐指数
2
解决办法
228
查看次数

多次 CREATE 和 DROP #SomeTable 是否“合法”?

我已经将我的代码分类为“连贯块”,我可以一遍又一遍地将其插入到更长的“配置脚本”中,我正在使用的模式之一是:

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火灾时已经存在。是什么赋予了?

我认为很明显我将不得不在脚本的开头声明一次表,截断而不是删除,但很自然地,无法删除表并再次使用相同的名称。

sql-server ssms t-sql sql-server-2008-r2

8
推荐指数
1
解决办法
469
查看次数

带 BEGIN/END 和不带 BEGIN/END 的 SP 的区别

我发现一些 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)

是什么让它与众不同?

sql-server t-sql

8
推荐指数
2
解决办法
6019
查看次数

可查询的查询

我希望这个问题很简单,我目前正在将一些脚本继承到我的项目中,由数据库管理员审查。显然以前从未这样做过,并且发现了很多问题。

我对此有点陌生,但我对 Sargable 和 Non-Sargable SQL 的理解是,违规函数正在列上运行,从而阻碍索引(假设存在索引),从而导致扫描列和性能受到打击。代码在输入中有几个函数,很多次要的东西,比如

Where a.date between 'inputdate' and dateadd(day,1,'inputdate')
Run Code Online (Sandbox Code Playgroud)

DBA 采取的立场是,任何WHERE子句中包含函数的查询都是不可复制的。我将放弃与他的问题,因为除了生气的管理员和我的访问受限之外,争论会让我无处可去。

但是为了知识起见,是否存在他是正确的并且WHERE从句中出现的任何功能都是问题的情况,无论功能或位置如何?

performance sql-server t-sql query-performance

8
推荐指数
1
解决办法
1196
查看次数

使用 COALESCE(...) 优化子查询的选择

我有一个从应用程序中使用的大视图。我想我已经缩小了我的性能问题,但我不确定如何解决它。视图的简化版本如下所示:

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 optimization t-sql subquery

8
推荐指数
1
解决办法
4416
查看次数

SQL Server 如何确定精度/小数位数?

我正在运行 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

sql-server t-sql sql-server-2012 decimal

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

在视图中将列定义为可以为空(但不在引用的表中)

我的公司正在努力实施一个新的 HR 应用程序,以统一我们现有的 HR 流程。不过,我们遇到了一些症结;根据业务规则,Employee表的EmployeeID和SupervisorID列不能为空。但是,应用程序要求这些列可以为空,并且不会在将列设置为不允许为空时同步这些列。

建议的解决方案是创建一个视图,其中架构似乎允许列中存在空值,同时保留表以防止它们被输入到数据中。我并不完全相信这是可能的,而且我一直无法找到一种方法来做到这一点。这可能吗?如果没有,处理这种情况的最佳方法是什么?

sql-server t-sql sql-server-2012

8
推荐指数
1
解决办法
6010
查看次数

多个存储过程中的相同代码

我最近加入了一家公司,我刚刚注意到许多存储过程都有相同的代码段重复。我注意到是因为我的任务是在它发生的每个 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 stored-procedures t-sql

8
推荐指数
1
解决办法
1438
查看次数