2024年8月14日 星期三

SQL - 為何使用 CROSS APPLY

 其實我本人一直都是慣用標準的 SQL 語法,

因為在跨DB時的相容性高;

但難免需要改到其他人寫的 SQL ,

一直以來對於 CROSS APPLY 都很懷疑,

為何要寫 CROSS APPLY ?

今天花了點時間查證一下,

第一:

基本上 CROSS APPLY, OUTER APPLY 相等於 JOIN, LEFT JOIN,

但在需要 JOIN RETURN TABLE 的 UDF 時,

如果需要傳入其他 TABLE 的欄位當條件時就只能用 APPLY。

參考資料【理解 SQL Server 的 CROSS APPLY 和 OUTER APPLY 査詢 - 第 2 部分

SELECT E.Id, E.Name, E.CountryName, TD.Name, E.CountryName

           FROM EMPLOYEE AS E

    CROSS APPLY GetDept(E.CountryName) TD

第二:

如果 JOIN 有複雜的條件的時候,

CROSS APPLY 的表現會比 JOIN 好,

參考資料【When should I use CROSS APPLY over INNER JOIN?

CROSS APPLY works better on things that have no simple JOIN condition.

This one selects 3 last records from t2 for each record from t1:

SELECT  t1.*, t2o.*
FROM    t1
CROSS APPLY
        (
        SELECT  TOP 3 *
        FROM    t2
        WHERE   t2.t1_id = t1.id
        ORDER BY
                t2.rank DESC
        ) t2o

It cannot be easily formulated with an INNER JOIN condition.

You could probably do something like that using CTE's and window function:

WITH    t2o AS
        (
        SELECT  t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
        FROM    t2
        )
SELECT  t1.*, t2o.*
FROM    t1
INNER JOIN
        t2o
ON      t2o.t1_id = t1.id
        AND t2o.rn <= 3

, but this is less readable and probably less efficient.

2023年4月18日 星期二

如何在 Windows 11 安裝 IIS 功能

1.按下【WIN + I】開啟【設定】。
2.點選【應用程式】(1)
3.點選【選用功能】(2)

4.移到最下面,點選【更多 Windows 功能】

5.在【Windows 功能】視窗就可以看到 IIS 的功能,依據所需要的功能勾選即可。











2023年4月10日 星期一

DevExpress - ToolBox 修復

安裝新版的 Virtual Studio 之後,

在舊版的 DevExpress 並不會自動安裝到新版的 Virtual Studio,

要讓新版的工具箱出現 DevExpress 的頁籤需要利用 DevExpress 提供的工具來修復,

步驟如下:

  1. 找到 DevExpress 安裝的目錄。
  2. 執行 ToolboxCreator.exe /ini:toolboxcreator.ini 。


經過上面的步驟應該就會修正好了,

如果不行,

還可以試看看 DevExpress 提供的工具【ToolboxAnalyzer.exe】,

我就是透過 ToolboxAnalyzer.exe 得知,需要 21.2.3 才能安裝在 vs2022 。

Ref【Resolve Issues With Toolbox Items


2021年11月29日 星期一

C# - 如何知道泛型的型態? 趴萬精進版

 簡單的說,

就是最近在寫程式的時候,

覺得怎麼可能要寫這麼麻煩!

後來試了一下,改成下面的寫法,

分開寫比較好理解!

private T GetAPOptionValue<T>(string value)

{

    object obj = value;


    TypeCode tc = Type.GetTypeCode(typeof(T));


    return (T)Convert.ChangeType(obj, tc);

}

但原理還是一樣的 C# - 如何知道泛型的型態?

2020年2月4日 星期二

SQL Server - 安裝卡住 - Install_VC10Redist_Cpu64_Action


NB維修回來之後安裝 SQL Server 2017, 2016 都遇到相同的問題,
如下圖所示




























解決方式如下,
當卡住時,到 SQL Server 的安裝目錄下找到 .\1028_CHT_LP\x64\Setup\sqlsupport_msi 目錄,
然後安裝 SqlSupport.msi,
接下來用系統管理員執行 cmd ,
並下下列指令
taskkill /F /FI "SERVEICES eq msiserver"
下完指令之後安裝就會繼續。

注意,如果沒有安裝 SqlSupport.msi 的話,
SQLServer 的 DB 過一陣子就會出現 0x00000000238000 位移的錯誤,
要你執行 DBCC CHECKDB 指令,但根本沒用,
只要再次安裝 SqlSupport.msi 就會好了。