2016-10-17 5 views
0

Ошибка происходит в этих строках:Конверсия удалось при преобразовании значения VARCHAR «» к типу данных междунар в SQL Server

Select 
    @RankId = @RankId + ', ' + ID 
From 
    RANKS 
Where 
    RANKS.ID IN (Select RANK_ID 
       From WORKFLOW_RANK 
       Where WORKFLOW_ID = @WFID) 

Select 
    @LocationId = @LocationId + ', ' + ID 
From 
    LOCATIONS 
Where 
    LOCATIONS.ID in (Select LOCATION_ID 
        From WORKFLOW_LOCATION 
        Where WORKFLOW_ID = @WFID) 

RankId и LocationId объявлены как int в таблицах.

Полный код:

Declare @i As Int 
    ,@mx As Int 
    ,@Ranks As nVarchar(250) 
    ,@Loc As nVarchar(250) 
    ,@WF As nVarchar(250) 
    ,@WFID as int 
    ,@RankId as int 
    ,@LocationId as int 

Create Table #Result (ID Int Identity(1,1),WORKFLOW_ID int,WORKFLOW nVarchar(100), RANKS Varchar(250), LOCATIONS Varchar(250),RankId int,LocationId int) 

Insert Into #Result (WORKFLOW_ID, WORKFLOW) 
    Select Distinct ID, WORKFLOW_NAME 
    From [WORKFLOW] 
    Where ID = 1 

Select @i = 1, @mx = Max(ID) 
From #Result 

While (@i < = @Mx) 
Begin 
    Select 
     @WFID = WORKFLOW_ID, 
     @WF = WorkFlow, 
     @Ranks = '', 
     @Loc = '' 
    From 
     #Result 
    Where 
     ID = @i 

    Select 
     @Ranks = @Ranks + ', ' + RANK_NAME 
    From 
     RANKS 
    Where 
     RANKS.ID in (Select RANK_ID From WORKFLOW_RANK 
        Where WORKFLOW_ID = @WFID) 

    Select 
     @Loc = @Loc + ', ' + LOCATION_NAME 
    From 
     LOCATIONS 
    Where 
     LOCATIONS.ID in (Select LOCATION_ID From WORKFLOW_LOCATION 
         Where WORKFLOW_ID = @WFID) 

    Select 
     @RankId = @RankId + ', ' + ID 
    From 
     RANKS 
    Where 
     RANKS.ID in (Select RANK_ID From WORKFLOW_RANK 
        Where WORKFLOW_ID = @WFID) 

    Select 
     @LocationId = @LocationId + ', ' + ID 
    From 
     LOCATIONS 
    Where 
     LOCATIONS.ID in (Select LOCATION_ID From WORKFLOW_LOCATION 
         Where WORKFLOW_ID = @WFID) 

    Update #Result 
    Set RANKS = Right(@Ranks, Len(@Ranks) - 2), 
     LOCATIONS = Right(@Loc, Len(@Loc) - 2), 
     RankId = Right(@RankId, Len(@RankId) - 2), 
     LocationId = Right(@LocationId, Len(@LocationId) - 2) 
    Where ID = @i 

    SET @i = @i + 1 
End 

Select * From #Result 
Drop Table #Result 

ответ

1

В SQL вы не можете явно объединить или добавить строковый символ в целочисленное значение. Используйте функцию CAST или CONVERT для достижения этой цели.

Попробуйте выполнить нижеследующий запрос. Так как вы сохраняете в виде строки изменить тип данных переменных @RankId и @LocationId

DECLARE @RankId VARCHAR(8000) 
DECLARE @LocationId VARCHAR(8000) 

1-ый запрос:

Select @RankId = COALESCE(@RankId + ',', '') + CAST(ID AS VARCHAR(50)) 
    From RANKS 
    Where RANKS.ID in (Select RANK_ID From WORKFLOW_RANK Where WORKFLOW_ID = @WFID) 

2-й один:

Select @LocationId = COALESCE(@LocationId + ',', '') + CAST(ID AS VARCHAR(50)) 
    From LOCATIONS 
    Where LOCATIONS.ID in (Select LOCATION_ID From WORKFLOW_LOCATION Where WORKFLOW_ID = @WFID) 

полный код должен измениться, как показано ниже :

Declare @i As Int 
    ,@mx As Int 
    ,@Ranks As nVarchar(250) 
    ,@Loc As nVarchar(250) 
    ,@WF As nVarchar(250) 
    ,@WFID as int 
    ,@RankId as Varchar(250) 
    ,@LocationId as Varchar(250) 

Create Table #Result (ID Int Identity(1,1),WORKFLOW_ID int,WORKFLOW nVarchar(100), RANKS Varchar(250), LOCATIONS Varchar(250),RankId VARCHAR(250),LocationId VARCHAR(250)) 

Insert Into #Result (WORKFLOW_ID,WORKFLOW) Select Distinct ID,WORKFLOW_NAME From [WORKFLOW] where ID=1 

Select @i = 1, @mx = Max(ID) From #Result 

WHILE (@i < = @Mx) 
    Begin 
     Select @WFID=WORKFLOW_ID, @WF = WorkFlow, @Ranks = '',@Loc ='' From #Result Where ID = @i 

     Select @Ranks = @Ranks + ', ' + RANK_NAME From RANKS Where RANKS.ID in (Select RANK_ID From WORKFLOW_RANK Where WORKFLOW_ID = @WFID) 

     Select @Loc = @Loc + ', ' + LOCATION_NAME From LOCATIONS Where LOCATIONS.ID in (Select LOCATION_ID From WORKFLOW_LOCATION Where WORKFLOW_ID = @WFID) 

     Select @RankId = COALESCE(@RankId + ',', '') + CAST(ID AS VARCHAR(50)) 
     From RANKS 
     Where RANKS.ID in (Select RANK_ID From WORKFLOW_RANK Where WORKFLOW_ID = @WFID) 

     Select @LocationId = COALESCE(@LocationId + ',', '') + CAST(ID AS VARCHAR(50)) 
     From LOCATIONS 
     Where LOCATIONS.ID in (Select LOCATION_ID From WORKFLOW_LOCATION Where WORKFLOW_ID = @WFID) 

     Update #Result Set RANKS =Right(@Ranks,Len(@Ranks)-2), 

     LOCATIONS = Right(@Loc,Len(@Loc)-2), 

     RankId = Right(@RankId,Len(@RankId)-2), 

     LocationId = Right(@LocationId,Len(@LocationId)-2) 

     Where ID = @i 

     SET @i = @i + 1 
    End 

Select * From #Result 
Drop Table #Result 
+0

Я попытался с указанным выше запросом, но он показывает null в поле RankId и LocationId. – Kedarnath

+0

используйте обновленный. –

+0

Для использования обновленного запроса ошибка «Ошибка преобразования при преобразовании значения varchar« 2,3 »в тип данных int». и ошибка появляется в строке «Обновить #Result Set RANKS = Right (@ Ranks, Len (@Ranks) -2),« – Kedarnath

0

Вы получаете сообщение об ошибке, поскольку вы пытаетесь добавить в varchar и int тип данных. Если вы используете SQL Server 2008 или более низкую версию, вам нужно преобразовать все в varchar, а затем добавить его.

DECLARE @RankId VARCHAR(1000) 

Select @RankId = COVERT(VARCHAR(50),@RankId) + ', ' + CONVERT(VARCHAR(50),ID) 
From RANKS Where RANKS.ID 
in (Select RANK_ID From WORKFLOW_RANK Where WORKFLOW_ID = @WFID) 

И если вы используете SQL Server 2012 или выше, то у вас есть функция CONCAT

DECLARE @RankId VARCHAR(1000) 

Select @RankId = CONCAT(@RankId,',',ID) 
From RANKS Where RANKS.ID 
in (Select RANK_ID From WORKFLOW_RANK Where WORKFLOW_ID = @WFID) 

DECLARE @LocationId VARCHAR(1000) 

Select @LocationId = CONCAT(@LocationId, ', ', ID) 
From LOCATIONS Where LOCATIONS.ID 
in (Select LOCATION_ID From WORKFLOW_LOCATION Where WORKFLOW_ID = @WFID) 

Update: Вы должны объявить @RankId и @LocationId в varchar(1000)

+0

Я пробовал с вышеуказанным запросом, но он показывает null в поле RankId и LocationId. – Kedarnath

+0

Я использую SQL Server 2012, и я использую второй запрос, он показывает ошибку «Ошибка конверсии при преобразовании значения varchar», 1 'в тип данных int. » – Kedarnath

+0

@Kedarnath Что такое тип данных 'WORKFLOW_ID' и' @ WFID' ?? –

Смежные вопросы

 Смежные вопросы