小编Dou*_*ats的帖子

嵌套 CTE 在某些情况下返回不正确的结果

好的,首先让我说我从以下方面得到了这个问题:

我试图帮助找出问题,但在尝试一步一步调试代码时被难住了。我知道这个问题是由于嵌套的 CTE(因为在调试过程中,如果你将每一步 aka cteX 转储到临时表中,就会获得正确的结果)但不知道它们是如何“在幕后”工作的,我无法在外面以一种明智的方式解释它“它不起作用哟。” 我怀疑这与编译器如何尝试在运行时同时评估它们有关,但没有更多上下文我不能肯定地说。

我的问题只是试图了解它们如何在幕后工作以及它与这种情况有何关系。现在我参与其中,我只想了解这个问题,以便将来可以与之交谈并同时学习一些有趣的东西。

在这里回答的人也可以在 SO 上交叉发布并在那里回答。

代码设置:

declare @t1 TABLE (ID varchar(max),Action varchar(max), DateTime datetime );
INSERT INTO @t1
Select *
from
(
VALUES 
('w2337','Open','2020-11-06 12:28:10.000'),
('w2337','Hold','2021-06-14 14:50:59.000'),
('w2337','Open','2021-06-14 14:51:26.000'),
('w2337','Hold','2021-06-15 14:50:59.000'),
('w2337','Open','2021-06-17 14:51:26.000'),
('w2337','Open','2021-06-18 14:51:26.000')

) t (ID, Action, DateTime);

with cte1 as (
select [ID],[Action],[DateTime]
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) as [RegIndex]
,DENSE_RANK () OVER (ORDER BY ID) as [Index by ID]
,ROW_NUMBER() OVER (PARTITION BY ID …
Run Code Online (Sandbox Code Playgroud)

sql-server cte

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

SQL Server CLR 函数中的 System.Web

我对这个主题做了一些简单的研究,我想知道什么是所有的优点和缺点,或者在 SQL Server 中启用/注册这个特定的 .dll?

返回信息 - 我们正在与第三方应用程序集成(不幸的是,这不是我的决定),它需要这个 .dll 来处理其他一些 .dll。我需要 CLR 函数的目的是能够在 SSMS 中编写 SQL 查询并将该数据发送到第三方应用程序的 API,然后第三方应用程序的 API 将依次执行正确的数据加载/更改(向/从该应用程序插入和删除)将通过其 API 完成)。

编辑 - 也许我应该包括这个细节

在尝试注册我的 c# 类时,我显然收到了错误“system.web 未注册等等等等”,这反过来又促使我对这个主题进行研究。

结束编辑

所以,我的难题是,为了能够注册我的 C# 类/.dll,我必须注册所有依赖的 .dll,但是根据我的研究,我知道这个特定的可能会有很大的问题。

因此,看到我对谷歌研究之外的陷阱并不十分熟悉,我想知道你们中的一个好人是否可以帮助我了解如何在这方面做出最佳决定。

另外,我还能在这篇文章中添加什么,以便更容易提供洞察力?我不太确定 C# 代码是否相关?我知道这可能有点宽泛,但我希望它足够具体而不会被标记?

更具体地说明这里发生的事情(根据所罗门的要求)

  1. 第 3 方应用程序使用“API”(松散使用,因为我被告知它不是一个很好的 API)来回发送数据。您会注意到它调用了一个 Importer 函数,该函数只接受它转换的数据表或 excel 文件。我别无选择,因为公司告诉我通过普通 XML 插入和删除非常慢并且有意外行为。

  2. 引用 System.Web 的 .DLL 在我的 C# 类中被引用,这是首先需要能够向它发送数据的。

  3. 关于:

    为什么你不能使用我提到的方法?它们已经存在于 SQL Server 的 CLR 主机中。这是一个网络服务,对吧

我不确定我对 API 的总体了解是否足以回答这个问题。我很愿意而且只是缺乏这样做的知识和经验。这也可能是因为我对如何与这个特定的 API 交互有限制,我不确定这些限制如何应用于这些方法。(我会进一步调查,看看我是否可以自己回答这个问题)。

尽管我考虑得越多,我可以创建一个 SQL Server 可以调用的“中间人”类,然后它会调用另一个类,该类将拥有所有正确的引用,这可能会让我摆脱当前的情况。但是,我仍然对具体的反馈感兴趣,以便我可以从中学习。

这是我的 C# 类:

    using Perfion.Api;   -- this .DLL …
Run Code Online (Sandbox Code Playgroud)

sql-server c# sql-clr web-service api

5
推荐指数
1
解决办法
286
查看次数

索引定义顺序和 ORDER BY 子句

所以我早上正在阅读博客,偶然发现了这个有趣的练习:

https://www.erikdarlingdata.com/sql-server/lets-design-an-index-together-part-3/

这是文章中的相关查询和他建议的索引。

SELECT TOP (5000)
       p.LastActivityDate,
       p.PostTypeId,
       p.Score,
       p.ViewCount
FROM dbo.Posts AS p
WHERE p.PostTypeId = 1
AND   p.LastActivityDate >= '20110101'
ORDER BY p.Score DESC;

CREATE INDEX whatever 
    ON dbo.Posts(PostTypeId, Score DESC, LastActivityDate) 
        INCLUDE(ViewCount) WITH (DROP_EXISTING = ON);
Run Code Online (Sandbox Code Playgroud)

非常有趣的构建和索引,并尝试相应地调整它。但是,我之前可能存在误解,认为索引键顺序很重要,并且当索引键顺序与查询不匹配时,某些 WHERE 子句可能不会使用某些索引。这意味着,我缺乏列出的特定场景的经验,我假设的想法是该查询不会使用该索引,因为 Score 位于索引键定义的中间,但不在查询的 where 子句中。

当优化器决定使用哪个索引时,ORDER BY 列是否会被评估,并且只要 WHERE 子句列和 ORDER by 列在索引定义中,那么它就会使用它?

我想我的问题更多是关于优化器如何评估 WHERE 子句和 ORDER BY 子句的索引。

index sql-server order-by

5
推荐指数
1
解决办法
492
查看次数

标签 统计

sql-server ×3

api ×1

c# ×1

cte ×1

index ×1

order-by ×1

sql-clr ×1

web-service ×1