ЗАПРОС выдает ошибку: ошибка преобразования при преобразовании значения nvarchar в тип данных int

#sql

#sql

Вопрос:

Когда я выполняю приведенный ниже запрос, он выдает ошибку

 "Msg 245, Level 16, State 1, Line 2
Conversion failed when converting the nvarchar value '13473,14586' to data type int." 
 

Эта функция string_agg() работает хорошо, если эти запросы выполняются независимо. Я заметил, что эта проблема возникает только тогда, когда запрос извлекает более одной строки, а запрос извлекает последнюю строку, после чего выдает ошибку.

   select (CASE WHEN row_number() over (partition by R.Productid order by R.Productid) = 1 AND 
                      Product_type !=15 THEN 
                            (SELECT string_agg(CAST(ISNULL(product_id,0) as nvarchar(500)),',') FROM PRODUCT
                            P1 WHERE P1.Productid = R.Productid and Product_type not in (4,5,15,8,6)
                            AND CONVERT(VARCHAR(6), P1.purchase_date, 112) <= CONVERT(VARCHAR(6), 
                            R.purchase_date, 112)) 
    
                      WHEN row_number() over (partition by R.Productid order by R.Productid) >1 AND 
                           Product_type !=15 AND row_number() over (partition by R.Productid order by 
                           R.Productid) < Product_period THEN 
                                (SELECT string_agg(CAST(ISNULL(product_id,0) as nvarchar(500)),',') FROM 
                                 PRODUCT P1 WHERE P1.Productid = R.Productid and Product_type not in 
                                 (4,5,15,6,8)
                                 AND CONVERT(VARCHAR(6), P1.purchase_date, 112) = CONVERT(VARCHAR(6), 
                                 R.purchase_date, 112) )           
         
                       WHEN row_number() over (partition by R.Productid order by R.Productid) >= 
                       Product_period and Product_type !=15 THEN
                           (SELECT string_agg(CAST(ISNULL(product_id,0) as nvarchar(500)),',') FROM PRODUCT 
                            P1 WHERE P1.Productid = r.Productid and Product_type in (4,5,15,6,8)
                            AND CONVERT(VARCHAR(6), P1.purchase_date, 112) >= CONVERT(VARCHAR(6), 
                            R.purchase_date, 112))
             ELSE 0 END ) "PRODUCT_External_Id"
        from  PRODUCT R
        JOIN Product_Category D ON R.Productid =D.Product_ID
        where D.Product_ID = R.Productid and R.Product_type in (5,15) 
        and Productid = 10 
        order by Productid,purchase_date'
 

Комментарии:

1. Обратите внимание, что вы продублировали условие СОЕДИНЕНИЯ. Вы можете удалить D.Product_ID = R.Productid из предложения WHERE.

2. markheath.net/post/effective-debugging-with-divide-and-conquer

3. Я предполагаю, что вы могли бы значительно упростить запрос, чтобы изолировать ошибку … а затем предоставить образцы данных, желаемые результаты и тег в базе данных, которую вы используете.