2013-04-01 4 views
0

Я видел этот вопрос во всех stackoverflow, но кажется, что существует множество решений, адаптированных к ситуации. Кажется, у меня есть уникальная ситуация, насколько я могу судить. Я бегу это SQL заявлениеПроблема преобразования varchar в INT на сервере sql

use IST_CA_2_Batch_Conversion 
GO 
--T-SQL script to populate the Match type column 
declare @MatchType varchar(16), 
@PK varchar(500), 
@CAReturnCode VARCHAR(255), 
@CAErrorCodes VARCHAR(255) 

declare cursor1 cursor fast_forward for 
select 
["Ref#"], 
["Return Code"], 
["Error Codes"] 
from CACodes2MatchType 

open cursor1 
fetch next from cursor1 into @PK,@CAReturnCode,@CAErrorCodes 

while @@fetch_status = 0 
begin 

set @MatchType = dbo.GetMatchType(@CAReturnCode,@CAErrorCodes) 

update CACodes2MatchType 
set [Match Type] = @MatchType 
where ["Ref#"] = @PK 

fetch next from cursor1 into @PK,@CAReturnCode,@CAErrorCodes 
end 
close cursor1 
deallocate cursor1 

Он провалится в

set @MatchType = dbo.GetMatchType(@CAReturnCode,@CAErrorCodes) 

Вот начало код функции GetMatchType:

-- Batch submitted through debugger:  
SQLQuery14.sql|6|0|C:\Users\b01642a\AppData\Local\Temp\~vs1C8E.sql 
CREATE FUNCTION [dbo].[GetMatchType](@CAReturnCode VARCHAR(255), @CAErrorCodes  
VARCHAR(255)) 
RETURNS VARCHAR(16) 
BEGIN 
    DECLARE @MatchType VARCHAR(16); 
    DECLARE @errorCodes TABLE(Pos INT, Code CHAR(2)); 
    DECLARE @country INT; -- 1 is US, 2 is Canada 
    DECLARE @numMinorChanges INT; 
    DECLARE @numMajorChanges INT; 
    DECLARE @numSingleCodes INT; 
    DECLARE @returnCode INT; 

    DECLARE @verified VARCHAR(16); 
    DECLARE @goodFull VARCHAR(16); 
    DECLARE @tentativeFull VARCHAR(16); 
    DECLARE @poorFull VARCHAR(16); 
    DECLARE @multipleMatch VARCHAR(16); 
    DECLARE @unmatched VARCHAR(16); 

    SET @verified = 'Verified'; 
    SET @goodFull = 'Good Full'; 
    SET @tentativeFull = 'Tentative Full'; 
    SET @poorFull = 'Poor Full'; 
    SET @multipleMatch = 'Multiple Match'; 
    SET @unmatched = 'Unmatched'; 

    SET @returnCode = CAST(@CAReturnCode AS INT); 

Я получаю сообщение об ошибке: Msg 245, Уровень 16, состояние 1, строка 21 Ошибка преобразования при преобразовании значения varchar '"1"' в тип данных int.

Эта ошибка происходит в последней строке сегмента кода я показал:

SET @returnCode = CAST(@CAReturnCode AS INT); 

Это код, который был написан коллегой и якобы работал на него. Я должен был устранить некоторые ошибки, но я не могу отлаживать это. Я понимаю, что многие люди создадут функцию dbo.split? Я не знаю, поможет ли этот вариант мне в этом сценарии. Я попытался установить @returnCode на varchar и избавиться от CAST на @CAReturnCode. В результате отладчик пропустит эту строку, но вызывает проблемы с остальной частью кода. Я предполагаю, что есть проблема с тем, как я использую @CAReturnCode? Любая помощь приветствуется.

+0

CAST ANSI, в то время как Convert является SQL-специфическим, вы можете попробовать использовать CONVERT там, так как он немного более интеллектуальный, как он хочет преобразовать значение. –

+0

Я дал это выстрел SET @returnCode = CONVERT (INT, @ CAReturnCode); и по-прежнему получают ту же ошибку – TaylorSmolik

ответ

2

Проблема в том, что @CAReturnCode содержит нечисловые символы.

-- Msg 245, Level 16, State 1, Line 21 Conversion failed when converting the varchar value '"1"' to data type int. 

См, внешние одиночные кавычки форматирования сообщения об ошибке, но внутренние двойные кавычки в значении @CAReturnCode. Поэтому решение состоит в том, чтобы гарантировать, что переменная содержит только числовые символы перед преобразованием. Если двойные кавычки являются единственной возможностью, вы можете сделать быстрый и грязный исправить так:

set @returnCode = cast(replace(@CAReturnCode, '"', '') as int) 

Если есть больше возможностей, вы могли бы сделать несколько ЗАМЕНЫ вызовов, или вы могли бы построить лучшую символьную функцию обрезки, что удалит все персонажи, которые вы укажете сразу сами.

+0

Замечательно! Когда вы видите кавычки весь день, легко смотреть мимо них. Спасибо. – TaylorSmolik