将排序规则添加到 SQL 服务器 CTE 语句

Adding Collation to a SQL Server CTE statement

我正在尝试确定如何将 COLLATION 添加到此操作....

WITH CTE (srtTxt, DuplicateCount)
AS
(
    SELECT 
       srtTxt,
       ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
    FROM dbo.tblLang
    **WHERE DuplicateCount > 1**
 )
 DELETE
 FROM CTE
 WHERE DuplicateCount > 1
 GO

这是我要应用的设置...

COLLATE Latin1_General_CS_AS srtTxt 

我已经尝试过像这样的各种改变....

WITH CTE (srtTxt, DuplicateCount)
AS
(
    SELECT 
       srtTxt,
       ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
    FROM 
       (SELECT srtTxt COLLATE Latin1_General_CS_AS AS srtTxt
        FROM dbo.tblLang) AS T
       **WHERE DuplicateCount > 1**
 )
 DELETE
 FROM CTE
 WHERE DuplicateCount > 1
 GO  

关于如何实现这个的任何想法?

我看到您在子查询中遗漏了 select ID 也请添加ID如下

;WITH CTE (srtTxt, DuplicateCount)
AS (
    SELECT 
    srtTxt,
    ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
    FROM (
    SELECT 
    ID, srtTxt COLLATE Latin1_General_CS_AS AS srtTxt
    FROM dbo.tblLang
    ) AS T
 )
 DELETE
 FROM CTE
 WHERE DuplicateCount > 1
 GO  

鉴于您正在删除,除了分区之外,您不需要select srtTxt,所以只需要:

WITH CTE
AS
(
    SELECT 
       ROW_NUMBER() OVER(PARTITION BY srtTxt COLLATE Latin1_General_CS_AS 
                         ORDER BY ID) AS DuplicateCount
    FROM dbo.tblLang
 )
 DELETE
 FROM CTE
 WHERE DuplicateCount > 1; 

但是,如果您确实还需要 select 重新整理的字段,为了防止在 Select 和分区中重复整理,您可以使用前面的 DRY this up CTE:

WITH Collated AS 
( 
   SELECT ID, srtTxt COLLATE Latin1_General_CS_AS srtTxt
   FROM dbo.tblLang
),
Duplicates(srtTxt, DuplicateCount)
 AS
 (
    SELECT srtTxt,
    ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
    FROM Collated
 )
 DELETE
 FROM Duplicates
 WHERE DuplicateCount > 1; 

Fiddle