Синтаксическая ошибка хранимой процедуры SQL Server при добавлении нескольких предложений OR - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь выбрать некоторые продукты из таблицы продуктов, используя хранимую процедуру в SQL Server 2016, но когда я добавляю несколько продуктов или предложение, возникает синтаксическая ошибка:

Сообщение 102, уровень 15, Состояние 1, Строка 5 Неверный синтаксис около '100'.

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

@StoreId int = null,
//the code is quite verbose and I added storeid variable as a clarification here 
//and in the actual code it is defined in the proper line(not here) and the part 
//that is creating the error is the below part cause I have tested it and When I 
//remove it, it performs ok
IF @ShowUnavailable = 1
        set @sql = 
            'SELECT Distinct P.ProductId, P.BrandId, P.[' + @OrderIndex + ']  FROM Products P INNER JOIN ProductStores PS ON P.ProductId = PS.ProductId ' +
            'Where  PS.StoreId = @StoreId and (PS.Status  IN (' + @availabilityStatus + ') or (PS.StoreId != @StoreId and PS.Status IN(0,2))'

Ответы [ 3 ]

1 голос
/ 24 апреля 2019

1, если переменная является целым числом, вам необходимо преобразовать ее в varchar. Потому что @sql это строка.

2, уточните тип данных @availabilityStatus. Я использовал «1,2» в качестве образца.

declare @StoreID int = 0
declare @OrderIndex int = 0
declare @availabilityStatus varchar(max) = '1,2'
declare @sql nvarchar(max)
set @sql = 
            'SELECT Distinct P.ProductId, P.BrandId, P.[' + cast(@OrderIndex as varchar(100)) + '] FROM Products P INNER JOIN ProductStores PS ON P.ProductId = PS.ProductId ' +
            'Where PS.StoreId = '+ cast(@StoreId as varchar(100))+ ' and (PS.Status  IN (' + @availabilityStatus + ') or (PS.StoreId != '+cast(@StoreId as varchar(100))+' and PS.Status IN(0,2))'

Print @sql

Результат теста: DB <> Fiddle

1 голос
/ 24 апреля 2019

В

'Where  PS.StoreId = **@StoreId** and (PS.Status  IN (' + @availabilityStatus + ') or (PS.StoreId != **@StoreId** and PS.Status IN(0,2))'

способ, которым вы прошли @StoreId, кажется, что-то не так.

пожалуйста, используйте правильное приведение или преобразование nvarchar в int, если это необходимо.

1 голос
/ 24 апреля 2019

Мне кажется, что @OrderIndex имеет тип данных INT, и во время конкатенации строк происходит неявное преобразование, создающее ошибку.Попробуйте преобразовать @OrderIndex как cast (@OrderIndex as varchar), чтобы устранить ошибку `[Преобразование не удалось при преобразовании значения nvarchar ... в тип данных int.]

Редактировать: если выше, дело не в том, и ошибка не приходитво время компиляции кода, но при выполнении динамической строки sql @sql, затем явно преобразуйте тип данных int в varchar для конкатенации строк как cast (@StoreID as varchar).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...