如何在SQL Server中强制转换从密集秩函数中提取的值
在下面的查询中,我想将密集秩函数转换为nvarchar(255),但它给出了语法错误。我有以下问题-如何在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]=[主地
选择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