【问题标题】:Converting NVARCHAR to INT after SUBSTRING using CHARINDEX and LEN使用 CHARINDEX 和 LEN 在 SUBSTRING 之后将 NVARCHAR 转换为 INT
【发布时间】:2019-04-18 09:46:08
【问题描述】:

我正在尝试使用 UI 连接两个表,但其中一个表中的 UI 前面有“CLIENT_”。当尝试从字符串中删除“CLIENT_”然后比较 UI 时,我收到以下错误。

将数据类型 nvarchar 转换为浮点数时出错。

当尝试将整个子查询转换或强制转换为 INT 或 FLOAT 时,会发生相同的错误。

有没有人有任何想法或知道我如何编写代码以使其正常工作。

SELECT DISTINCT 69 AS 'FIELD_ID',
ENTITY_ID,
AD.WIP AS 'WIP'
FROM [WORKVIEW].[DBO].ENTITY_MASTER EM
JOIN [LIVE].[MHGROUP].PROJECTS P ON P.PRJ_ID = EM.ENTITY_PARENT 
JOIN [WORKVIEW].[DBO].adn_NAMEACCOUNTSDATA_STAGING AD ON 
CAST((SELECT SUBSTRING(P.CUSTOM1, CHARINDEX ('_', P1.CUSTOM1) -1, LEN(P1.CUSTOM1)) 
FROM [IMAN-SQL].[LIVE].[MHGROUP].PROJECTS P1 
WHERE P.CUSTOM1 LIKE 'CLIENT_%') AS INT) = AD.NAMENO

我希望能够加入 P.CUSTOM1 和 AD.NAMENO 上的 NAMEACCOUNTSDATA_STAGING,因为这些是我可以将这些表加入在一起的唯一字段。

这项工作的最新尝试....

SELECT DISTINCT 69 AS 'FIELD_ID',
ENTITY_ID,
AD.WIP AS 'WIP'
FROM [WORKVIEW].[DBO].ENTITY_MASTER EM
JOIN [IMAN-SQL].[LIVE].[MHGROUP].PROJECTS P ON P.PRJ_ID = EM.ENTITY_PARENT 
JOIN [WORKVIEW].[DBO].WORKVIEW_NAMEACCOUNTSDATA_STAGING AD ON CONCAT('CLIENT_', AD.NAMENO) = P.CUSTOM1 AND P.CUSTOM1 LIKE 'CLIENT_%'

涉及的所有三个表的架构:

TABLE [dbo].[entity_master](
[entity_id] [int] IDENTITY(1,1) NOT NULL,
[entity_parent] [nvarchar](50) NOT NULL,
[entity_child] [nvarchar](50) NOT NULL,
[entity_status] [int] NOT NULL,
[entity_child_name] [nvarchar](250) NULL,
[entity_parent_name] [nvarchar](250) NULL,
[GUID] [varchar](50) NULL,

TABLE [dbo].[WORKVIEW_NAMEACCOUNTSDATA_STAGING](
[NAMENO] [int] NOT NULL,
[WIP] [decimal](18, 2) NULL,
[BILLED] [decimal](18, 2) NULL,
[WRITTENOFF] [decimal](18, 2) NULL,
[DEBTORRESTRICTION] [nvarchar](max) NULL,
[PAYMENTTERMS] [int] NULL,
[BILLING FREQUENCY] [nvarchar](max) NULL

TABLE [MHGROUP].[PROJECTS](
[PRJ_ID] [float] NOT NULL,
[PRJ_PID] [float] NULL,
[DEFAULT_SECURITY] [char](1) NOT NULL,
[IS_SECURED] [char](1) NOT NULL,
[PRJ_NAME] [nvarchar](254) NULL,
[PRJ_OWNER] [nvarchar](64) NULL,
[PRJ_DESCRIPT] [nvarchar](254) NULL,
[PRJ_STATE] [char](1) NULL,
[PRJ_PUBLIC] [char](1) NULL,
[PRJ_LOCATION] [nvarchar](254) NULL,
[TYPE] [int] NOT NULL,
[SUBTYPE] [nvarchar](64) NULL,
[INHERITS_SECURITY] [char](1) NOT NULL,
[DOCNUM] [float] NULL,
[VERSION] [int] NULL,
[CUSTOM1] [nvarchar](254) NULL,
[CUSTOM2] [nvarchar](254) NULL,
[CUSTOM3] [nvarchar](254) NULL,
[LEFT_VISIT] [int] NULL,
[RIGHT_VISIT] [int] NULL,
[TREE_ID] [int] NULL,
[EMAIL] [nvarchar](254) NULL,
[DOC_SAVED_SEARCH] [int] NULL,
[LAYOUT_NAME] [nvarchar](254) NULL,
[LAYOUT_ORDER] [int] NULL,
[LAYOUT_VIEW] [nvarchar](max) NULL,
[REFERENCE_DATABASE] [nvarchar](32) NULL,
[REFERENCE_PRJ_ID] [float] NULL,
[REFERENCE_TYPE] [int] NULL,
[REFERENCE_SUBTYPE] [nvarchar](64) NULL,
[IS_EXTERNAL] [char](1) NOT NULL,
[EXTRNL_AS_NRML] [char](1) NOT NULL,
[IS_DOC_SVD_SRCH] [char](1) NOT NULL,
[IS_PRJ_SVD_SRCH] [char](1) NOT NULL,
[IS_HIDDEN] [char](1) NOT NULL,
[EDITWHEN] [datetime] NOT NULL,

希望这就是您想要的。

【问题讨论】:

  • AD.NAMENO 绝对是 INT 列吗?请发布一些使用其数据类型的表的详细信息(或至少用于连接的列)
  • 哦 - 还要标记您正在使用哪种 SQL 风格(例如 TSQL、MySQL、Postgre 等)
  • 嗨 iainc,感谢您的回复。我已经包括了你的要求。希望这对您有所帮助。

标签: sql tsql join substring charindex


【解决方案1】:

将数字转换成字符串!

(SELECT SUBSTRING(P.CUSTOM1, CHARINDEX ('_', P1.CUSTOM1) -1, LEN(P1.CUSTOM1)) 
 FROM [IMAN-SQL].[LIVE].[MHGROUP].PROJECTS P1 
 WHERE P.CUSTOM1 LIKE 'CLIENT_%'
) = CONVERT(NVARCHAR(254), AD.NAMENO)

或者:

(SELECT P.CUSTOM1
 FROM [IMAN-SQL].[LIVE].[MHGROUP].PROJECTS P1 
 WHERE P.CUSTOM1 LIKE 'CLIENT_%'
) = CONCAT('CLIENT_', AD.NAMENO)

【讨论】:

  • 感谢 Gordon,这两种方法我都试过了,都没有解决“将数据类型 nvarchar 转换为浮点数时出错”的错误消息。我尝试使用 CONCAT 应用您的第二个想法,而无需对连接进行子查询,但仍然遇到相同的错误。我真的不确定为什么这不起作用。我在上面的帖子中添加了我最近的尝试。
  • @AlexNewsum 。 . .然后转换问题发生在查询的其他地方。
  • 天哪,你是对的。我刚刚用另一双眼睛看着这个问题,正是 PROJECTS 表上的 P.PRJ_ID 连接导致了这个问题!我只是将它转换为 NVARCHAR 并且它工作正常。感谢大家的帮助,因为它最终让我到达了那里!
【解决方案2】:

你测试你的子字符串了吗?在我的测试中,我得到了

将 nvarchar 值“T_1456”转换为数据类型 int 时转换失败。

因此,子字符串正在获取下划线的 charindex,然后您将删除一个字符以获取无法转换为 INT 的 T_。更改为加号而不是减号可以获得有效的联接。

CAST((SELECT SUBSTRING(P.CUSTOM1, CHARINDEX ('_', P1.CUSTOM1) +1, LEN(P1.CUSTOM1)) 

【讨论】:

  • 非常感谢,我意识到我肯定有一个 - 而不是 +。但是,我仍然遇到同样的错误 - 将数据类型 nvarchar 转换为浮点数。我已经尝试了很多不同的变体,但都没有运气。
  • 您能否发布所涉及表的数据架构。我的查询建模没有问题。
  • 非常感谢您在这方面的帮助。我已经发布了所涉及的三个表的架构。我只是不明白为什么这行不通。是脚本中的其他内容吗?
  • 我看到 Gordon 打败了我!
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多