ahmed_sa Ответов: 1

При выполнении динамического запроса преобразование поля имени в числа дает ошибку ?


Я работаю на SQL server 2012 и сталкиваюсь с проблемой, как показано ниже :

Msg 245, Уровень 16, Состояние 1, Строка 1
Преобразование не удалось при преобразовании значения nvarchar '1.2 kV' в тип данных int.

эта ошибка сделана там, где преобразование имени в число, но это не удалось .

в качестве примера имя имеет значение 1.2 v тогда если я получу числа из имени так будет 1.2 и в этом случае не будет получена ошибка

а если я найду N/A конвертировать в 0

так как же получить числа из имени, чтобы предотвратить его отображение этой ошибки .

Сгенерированный Запрос :

SELECT PartID, Code, Count(1) as ConCount
FROM #PartAttributes PM
INNER JOIN #Condition Co ON Co.ZfeatureKey = PM.ZfeatureKey Where 1=1 and ( (PM.ZfeatureKey = 1505730036 And replace(Name, 'VDC', space(4))  >1000) OR (PM.ZfeatureKey = 1505730036 And replace(Name, 'VDC', space(4)) >280) OR (PM.ZfeatureKey = 1505730036 And replace(Name, 'VDC', space(4)) = 'N/A') ) Group By PartID,Code  Having Count(1)> = 4


вопрос по запросу выше по имени на условии Where .

Что я уже пробовал:

if object_id(N'tempdb..#PartAttributes') is not null drop table #PartAttributes
    
    
 if object_id(N'tempdb..#Condition') is not null drop table #Condition
    
    
 if object_id(N'tempdb..#Allfeatures') is not null drop table #Allfeatures
 if object_id(N'tempdb..#Codes') is not null drop table #Codes
    
 create table #Allfeatures
    (
     ZPLID INT,
     ZFeatureKey nvarchar(20),
     IsNumericValue int
    ) 
    insert into #Allfeatures(ZPLID,ZFeatureKey,IsNumericValue)
    values(75533,'1505730036',0)
                            
    create table #Condition
    (
     Code nvarchar(20),
     ZFeatureKey nvarchar(20),
     ZfeatureType nvarchar(20),
     EStrat  nvarchar(20),
     EEnd NVARCHAR(10)
    )
    insert into #Condition (Code,ZFeatureKey,ZfeatureType,EStrat,EEnd)
    values
    ('8535400000','1505730036',NULL,'>1000',' '),
    ('8535400000','1505730036',NULL,'>280AV',' '),
    ('8535400000','1505730036',NULL,'N/A',' '),
    ('8535400000','1505730036',NULL,NULL,' ')
                            
    CREATE TABLE #PartAttributes
    (
     PartID INT,
     ZFeaturekEY NVARCHAR(20),
     AcceptedValuesOption_Value  INT,
     Name nvarchar(20)
    )
    insert into #PartAttributes(PartID,ZFeaturekEY,AcceptedValuesOption_Value,Name)
    values
    (4977941,1505730036,280,'1.2kV'),
    (4977936,1505730036,280,'280VDC'),
    (4977935,1505730036,280,'100V'),
    (4977808,1505730036,280,'N/A'),
    (4979054,1505730036,280,'24VAC/DC')
                            
     DECLARE @Sql nvarchar(max)
     DECLARE @ConStr nvarchar(max)
                                            
    SET @ConStr = STUFF((
    SELECT CONCAT(' OR (PM.ZfeatureKey = ', CC.ZfeatureKey, IIF(CC.ZfeatureType = 'Qualifications', ' And AcceptedValuesOption_Value ', ' And replace(Name, ''VDC'', space(4)) '), 
    CASE 
    WHEN EStrat = 'N/A' THEN '= ''N/A''' 
    ELSE CAST(LEFT(SUBSTRING(EStrat, PATINDEX('%[<>0-9.-]%', EStrat), 2500), PATINDEX('%[^<>0-9.-]%', SUBSTRING(EStrat, PATINDEX('%[<>0-9.-]%', EStrat), 2500) + 'X') -1) AS nvarchar(2500)) 
    END, ')')
       FROM #Condition CC INNER JOIN #Allfeatures AL ON AL.ZfeatureKey = CC.ZfeatureKey AND AL.IsNumericValue = 0
      WHERE EStrat IS NOT NULL
    FOR XML PATH(''), TYPE).value('(./text())[1]','varchar(max)'), 1, 3, '')
            
     ----------------                    
     SET @Sql= CONCAT(' SELECT PartID, Code, Count(1) as ConCount
     FROM #PartAttributes PM 
     INNER JOIN #Condition Co ON Co.ZfeatureKey = PM.ZfeatureKey ',
     'Where 1=1 and (', @ConStr, ' ) Group By PartID,Code ' ,
     ' Having Count(1)> = ',(SELECT COUNT(1) FROM #Condition))
        
     EXEC (@SQL)

1 Ответов

Рейтинг:
2

Richard MacCutchan

Строка "1.2 КВ" не является допустимым числом. Вам нужно разобрать "kV" и просто paas "1.2" для вызова convert.