如何在SQL Server中强制转换从密集秩函数中提取的值

如何在SQL Server中强制转换从密集秩函数中提取的值,sql,sql-server,dense-rank,Sql,Sql Server,Dense Rank,在下面的查询中,我想将密集秩函数转换为nvarchar(255),但它给出了语法错误。我有以下问题- 是否可以强制转换密集秩函数返回的值 如果是,语法是什么 选择cast('P'作为NVARCHAR(3))作为地址类型光盘, (按[客户密钥]分区)上的稠密_秩() 订购人[主地址行1], [主地址行2], [主地址行3]+[主地址行4], [主要城市], [主要国家], [主要邮政编码], [主要国家])作为地址标志, [客户密钥], [主地址行1]作为PA1, 案例 当[主地址行1]=[主地

在下面的查询中,我想将密集秩函数转换为nvarchar(255),但它给出了语法错误。我有以下问题-

  • 是否可以强制转换密集秩函数返回的值
  • 如果是,语法是什么
    选择cast('P'作为NVARCHAR(3))作为地址类型光盘,
    (按[客户密钥]分区)上的稠密_秩()
    订购人[主地址行1],
    [主地址行2],
    [主地址行3]+[主地址行4],
    [主要城市],
    [主要国家],
    [主要邮政编码],
    [主要国家])作为地址标志,
    [客户密钥],
    [主地址行1]作为PA1,
    案例
    当[主地址行1]=[主地址行2]时,则为空
    ELSE[主地址行2]
    以PA2结尾,
    [主地址行3]+[主地址行4]作为PA3,
    [主要城市]作为PCCity,
    [主状态]作为PS,
    [主拉链]作为PZ,
    [主要国家]作为个人电脑
    来自mtb.DBO.EnrichedFile
    何处应用程序“RBC”
    
    给你:

    SELECT CAST(ADDRESS_FLAG AS NVARCHAR(255)) AS ADDRESS_FLAG_STR,
           --... blah blah blah
    FROM
    (
     SELECT --.. blah blah blah
            DENSE_RANK() ... blah blah ...  AS ADDRESS_FLAG,
            --... blah blah blah
    ) SUB
    
    我发现,使用OVER函数,在操作它们之前,需要将它们放入子查询中。您可以像处理普通字段一样处理一些事情——一旦查询正常工作,您就可以随时进行重构

    SELECT 
     CAST((DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] 
                                ORDER BY [MAILING ADDRESS LINE 1],
                                         [MAILING ADDRESS LINE 2],
                                         [MAILING ADDRESS LINE 3]+[MAILING ADDRESS LINE 4],
                                         [MAILING CITY],
                                         [MAILING STATE],
                                         [MAILING ZIP],
                                         [MAILING COUNTRY]) as nvarchar(255)) AS ADDRESS_FLAG
    
    应该是

    SELECT 
     CAST(DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] 
                                ORDER BY [MAILING ADDRESS LINE 1],
                                         [MAILING ADDRESS LINE 2],
                                         [MAILING ADDRESS LINE 3]+[MAILING ADDRESS LINE 4],
                                         [MAILING CITY],
                                         [MAILING STATE],
                                         [MAILING ZIP],
                                         [MAILING COUNTRY]) as nvarchar(255)) AS ADDRESS_FLAG
    
    你有一个多余的开口支架

    不过,你为什么要把它转换成
    nvarchar(255)


    即使有合理的理由想要它作为字符串,它可能拥有的最大值是
    9223372036854775807
    所以
    varchar(19)
    就足够了。

    你甚至尝试过谷歌吗?关于秩函数有很多文档。我知道什么是秩和密秩@Maverick。但是,我的问题是如何强制转换一个由密集秩函数创建的列。为什么这个列被标记为MySQL、Oracle和SQL Server?如果问题是关于SQL Server,为什么这个列被标记为MySQL和Oracle?另外,您实际上在哪里强制转换该列,错误在哪里?@MartinSmith-因为我必须在Oracle、SQLserver和MySQL数据库中强制转换它。然而,我需要知道这是否可能。如果是,那么我只需要其中任何一个的语法。目前,它抛出语法错误,我不确定这是否可能。谢谢回答这个问题。我没有使用子查询就让它工作了。我现在发布我的答案。谢谢你的帮助!我使用nvarchar(255)将其加载到具有相同数据类型的目标表中。
    cast(DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] ORDER BY [PRIMARY ADDRESS LINE 1],[PRIMARY ADDRESS LINE 2],[PRIMARY ADDRESS LINE 3] + [PRIMARY ADDRESS LINE 4],[PRIMARY CITY],[PRIMARY STATE],[PRIMARY ZIP],[PRIMARY COUNTRY] ) as nvarchar(255)) AS ADDRESS_FLAG 
    
    cast(DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] ORDER BY [PRIMARY ADDRESS LINE 1],[PRIMARY ADDRESS LINE 2],[PRIMARY ADDRESS LINE 3] + [PRIMARY ADDRESS LINE 4],[PRIMARY CITY],[PRIMARY STATE],[PRIMARY ZIP],[PRIMARY COUNTRY] ) as nvarchar(255)) AS ADDRESS_FLAG