2015-04-22 5 views
0

В следующем запросе я передаю 2 параметра, но ударяя эту ошибкуКонверсия удалось при преобразовании значения VARCHAR «SVGFPPL PONDY» к типу данных междунар в хранимой процедуре

«Конверсия не удалось при преобразовании значения VARCHAR«SVGFPPL PONDY ' к типу данных int. "

Пожалуйста, помогите мне решить эту проблему ..

ALTER PROCEDURE dbo.[Product] 
-- Add the parameters for the stored procedure here 
@i_LocationID Varchar(50), 
@i_ProductTypeID Varchar(50)='0' 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    --/************ Get Purchase Product based on location*************\-- 





    SELECT P.ProductID, P.ProductName FROM Product P   
    LEFT OUTER JOIN LocationProductMap LPM ON LPM.ProductID = P.ProductID   
    WHERE LocationID [email protected]_LocationID AND (@i_ProductTypeID ='0' OR P.ProductType = @i_ProductTypeID 

    --/************ Product based on location*************\-- 

     SELECT P.ProductID,P.ProductName FROM Product P   
    LEFT OUTER JOIN LocationProductMap LPM ON LPM.ProductID = P.ProductID   
    WHERE [email protected]_LocationID AND LPM.ProductInFlow = 2 AND (@i_ProductTypeID ='0' OR [email protected]_ProductTypeID) 
END 
+1

Вопрос, скорее, почему вы пытаетесь сравнить данные VARCHAR с целочисленными данными? – jarlh

ответ

1

Эта ошибка происходит потому, что либо, или оба LocationProductMap.LocationID или Product.ProductType целые столбцы, в то время как вы пытаетесь сравнить их с параметрами, передаваемыми VARCHAR в ваш PROC. Следующий MVCE демонстрирует это:

CREATE Table dbo.Foo 
(ID INT); 
GO 

CREATE PROC dbo.FindFoo 
    @i_Foo VARCHAR(50) 
AS 
    SELECT * FROM dbo.Foo Where ID = @i_Foo 
GO 

EXEC FindFoo 'bar' 

Msg 245, Level 16, State 1, процедура FindFoo, линия 19 Конверсия удалось при преобразовании 'бар' Значение VARCHAR к типу данных междунар.

Решение состоит в том, чтобы настроить параметры таким образом, чтобы они соответствовали типам столбцов. Я бы предложил использовать NULL (а не «0») для представления необязательного фильтра в запросе. Кроме того, разве вы не пропустили UNION из двух запросов? В противном случае ваш прок будет возвращать два результирующих - т.е. ваш PROC может выглядеть следующим образом:

CREATE PROC dbo.FindStuff 
    @i_FooID INT, 
    @i_BarID INT 
AS 
    SELECT Foo.ID, Foo.Name FROM dbo.Foo WHERE @i_FooID IS NULL OR Foo.ID = @i_FooID 

    UNION 

    SELECT Bar.ID, Bar.Name FROM dbo.Bar Where @i_BarID IS NULL OR Bar.ID = @i_BarID 
GO 
0

попробовать this-

WHERE convert(varchar(50),LocationID) = @i_LocationID 
AND 
(@i_ProductTypeID ='0' OR convert(varchar(50),P.ProductType) = @i_ProductTypeID 
... 
WHERE convert(varchar(50),LocationID)[email protected]_LocationID 
AND 
LPM.ProductInFlow = 2 
AND (@i_ProductTypeID ='0' OR convert(varchar(50),P.ProductType)[email protected]_ProductTypeID) 
Смежные вопросы

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