Преобразование NVARCHAR в INT после SUBSTRING с использованием CHARINDEX и LEN - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь объединить две таблицы, используя пользовательский интерфейс, но перед ним в одной из таблиц стоит CLIENT_.При попытке удалить CLIENT_ из строки и затем сравнить пользовательский интерфейс, я получаю следующую ошибку.

Ошибка преобразования типа данных nvarchar во float.

При попытке преобразовать или привести весь подзапрос к 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

Я хотел бы иметь возможность присоединиться к NAMEACCOUNTSDATA_STAGING для P.CUSTOM1 и AD.NAMENO, так как это единственные поля, с которыми я могу объединить эти таблицы вместе.

ПОСЛЕДНЯЯ ПОПЫТКА ПРИ ИЗГОТОВЛЕНИИЭТА РАБОТА ....

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,

Надеюсь, это то, что вы искали.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Преобразовать число в строку !

(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)
0 голосов
/ 18 апреля 2019

Вы проверяли свою подстроку? В моем тестировании я получаю

Ошибка преобразования при преобразовании значения nvarchar 'T_1456' в тип данных int.

Таким образом, подстрока получает хариндекс подчеркивания, затем вы удаляете символ, чтобы получить T_, который не может быть преобразован в INT. Изменение на плюс вместо минуса дает действительное объединение.

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