2016-06-15 4 views
0

У меня есть 2 таблицы, в одной из которых хранятся точки пользователей, а в другой - продукты, которые были приобретены пользователями.Ошибка преобразования типа данных nvarchar в bigint в SQL Server в select statement

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

Я написал SQL запрос, чтобы найти разницу, но есть ошибка относительно приведения типа

select sum(point) 
from UserPoints 
where Userid = (select id 
       from AspNEtusers 
       where username ='1-V2-4128') 
- 
(
    select sum(o.quantity*o.pointperitem) as Total 
    from AspNetusers as A 
    inner join 
    MyOrders as M 
    inner join OrderedProducts as O 
     on O.Orderid = M.id 
     on M.Userid= A.id 
    where A.username='1-V2-4128' 
) 

Ошибка брошено:

Ошибка преобразования типа данных NVARCHAR в BigInt

Затем я попробовал

select 
    sum(point) 
from 
    UserPoints 
where 
    Userid = (select id 
       from AspNEtusers 
       where username ='1-V2-4128') 
- convert(
bigint(50), 
(
select sum(o.quantity*o.pointperitem) as Total from AspNetusers as A inner join MyOrders as M inner join OrderedProducts as O 
on O.Orderid = M.id 
on M.Userid= A.id 
where A.username='1-V2-4128') 
) 

Ошибка выброшен является

CAST или CONVERT: недопустимые атрибуты, заданные для типа «» BIGINT

+1

Какие типы 'point',' количество' и 'pointperitem'? –

+2

Ваш запрос не имеет смысла. Почему вы вычитаете «Total» из идентификатора пользователя? –

+0

вопрос не содержит достаточной информации для ответа –

ответ

1

Я нашел слабое знание T-SQL после изучения этого запроса.

Из запроса ясно, что вы готовы вычесть общие точки из UserPoint с суммарными очками за элемент из OrderedProducts.

Но проблема:

SELECT PointTotal - SELECT PointPerItemTotal -- Which is not the way to subtract in T-SQL 

Оно должно быть:

SELECT (PointTotal - PointPerItemTotal) AS Total -- Correct way for any 
               -- arithmetic operation in T-SQL 

Таким образом, запрос должен быть:

DECLARE @UserId NVARCHAR(50) = (SELECT Id -- supposing uniqueidentifier 
           FROM AspNEtusers 
           WHERE UserName = '1-V2-4128') 

SELECT 
    (
     ISNULL((
      SELECT 
       SUM(Point) AS TotalUserPoints -- column should be numberic type  
      FROM 
       UserPoints 
      WHERE 
       Userid = @UserId 
     ), 0) 
     - ISNULL((
      SELECT 
       SUM(o.quantity*o.pointperitem) AS TotalPointPerItem -- column should be numberic type 
      FROM  
       MyOrders AS M 
       INNER JOIN OrderedProducts AS O 
        ON O.Orderid = M.id   
      WHERE  
       M.Userid = @UserId 
     ), 0) 
    ) AS Total 
1

Как я не указывает на комментировать положить это как ответ. Для второго запроса проблема связана с bigint (50). Вы должны просто использовать convert (bigint, expression).

Для первого запроса я предполагаю, что вы пытаетесь сохранить данные из расчета в nvarchar. Или проверьте данные столбцов, которые вы используете для расчета, поскольку они могут содержать строковые значения. Или в предложении where для всех этих столбцов проверьте IsNumeric.

т.е.

select sum(point) 
from UserPoints 
where Userid = ( select id 
        from AspNEtusers 
        where username ='1-V2-4128') 
     AND ISNUMERIC(point) = 1 

- 

( select sum(o.quantity*o.pointperitem) as Total 
    from AspNetusers as A 
    inner join MyOrders as M 
     on O.Orderid = M.id 
    inner join OrderedProducts as O 
     on M.Userid= A.id 
    where A.username='1-V2-4128' AND ISNUMERIC(o.quantity) = 1 AND ISNUMERIC(o.pointperitem) = 1) 
Смежные вопросы