2015-02-17 4 views
0

Я хочу написать хранимую процедуру для этого запроса!Как создать хранимую процедуру для этого запроса?

Мой запрос:

SELECT * 
FROM [dbo].[Table_asbabbazi] 
WHERE 
    name_product LIKE '%'+'ibm'+ '%' 
    AND first_price BETWEEN 5000 AND 100000 
    AND collection_1 = 'collection1' 
    AND id_state = 8 

Я написал динамический хранимую процедуру так:

ALTER PROCEDURE [dbo].[Asbabbazi_A] 
    @name_product nvarchar(50), 
    @first_price int, 
    @final_price int, 
    @collection_1 nvarchar(30), 
    @id_state tinyint 
AS 
BEGIN 
    DECLARE @SQLstring nvarchar(1000) 
    DECLARE @PARAMS nvarchar(1000) 

    SET @SQLstring = 'SELECT IDproduct, name_product, first_price, final_price, max_registered_price, final_date_view_shamsi, count_views, image_1 FROM dbo.Table_asbabbazi WHERE active= 0 ' 

    if(@name_product != 'no name') 
     set @SQLstring = @SQLstring + ' AND name_product LIKE '''+ '%' + @name_product + '%' + '''' 

    if (@final_price != 0) 
     set @SQLstring = @SQLstring + ' AND first_price between @first_price AND @final_price' 

    if (@collection_1 != 'انتخاب کنید') 
     set @SQLstring = @SQLstring + ' AND collection_1 = @collection_1' 

    if (@id_state != 0) 
     set @SQLstring = @SQLstring + ' AND id_state = @id_state ' 
    set @PARAMS='@name_product nvarchar(50), 
    @first_price int, 
    @final_price int, 
    @collection_1 nvarchar(30), 
    @id_state tinyint' 

    EXECUTE sp_executesql @SQLstring, @PARAMS, @name_product, @first_price, @final_price, @collection_1, @id_state 
END 

Эта хранимая процедура работала, но есть проблема: когда установлено значение для name_product он показывает один продукта или любого продукта. Я тестирую запрос в SQL Server Management Studio и работает правильно. Но этот запрос в хранимой процедуре работает неправильно. Я думаю, что проблема в этом ряду

if(@name_product != 'no name') 
    set @SQLstring = @SQLstring + ' AND name_product LIKE '''+ '%' + @name_product + '%' + '''' 

Пожалуйста, помогите

ответ

1

изменить свой запрос следующим образом:

Использование print @SQLstring для отладки запросов

DECLARE @SQLstring nvarchar(1000) 
DECLARE @PARAMS nvarchar(1000) 
set @SQLstring = 'SELECT IDproduct,name_product,first_price,final_price,max_registered_price, 
       final_date_view_shamsi, 
        count_views,image_1 from dbo.Table_asbabbazi where active= 0 ' 
if(@name_product != 'no name') 
set @SQLstring = @SQLstring + ' AND name_product LIKE '''+ '%' + @name_product + '%' + '''' 
if (@final_price != 0) 
set @SQLstring = @SQLstring + ' AND first_price between '+CAST(@first_price as nvarchar(10))+' AND 
'+CAST(@final_price as nvarchar(10))+'' 
if (@collection_1 != 'انتخاب کنید') 
set @SQLstring = @SQLstring + ' AND collection_1 = '''[email protected]_1 +''' ' 
if (@id_state != 0) 
set @SQLstring = @SQLstring + ' AND id_state = '+CAST(@id_state as nvarchar(10)) 
set @PARAMS='@name_product nvarchar(50), 
    @first_price int, 
    @final_price int, 
    @collection_1 nvarchar(30), 
    @id_state tinyint' 

print @SQLstring 
EXECUTE sp_executesql @SQLstring, 
@PARAMS, 
@name_product, 
@first_price, 
@final_price, 
@collection_1, 
@id_state 
+0

спасибо за ответы .Why вы использовали метод CAST()? Где я должен использовать print @SQLstring? – XXA

+0

@HosseinMahdavi отметьте это как ответ, как вы думаете, это полезно –

+0

Почему вы использовали метод CAST()? Где я должен использовать print @SQLstring? – XXA

0

У вас есть дополнительные кавычки в вашем как заявление cahnge ваше заявление как это

' AND name_product LIKE ''%' + @name_product + '%''' 

Вот ваш полный SP

ALTER PROCEDURE [dbo].[Asbabbazi_A] 
@name_product nvarchar(50), 
@first_price int, 
@final_price int, 
@collection_1 nvarchar(30), 
@id_state tinyint 
AS 
BEGIN 
DECLARE @SQLstring nvarchar(1000) 
DECLARE @PARAMS nvarchar(1000) 
set @SQLstring = 'SELECT IDproduct,name_product,first_price,final_price,max_registered_price, 
      final_date_view_shamsi, 
       count_views,image_1 from dbo.Table_asbabbazi where active= 0 ' 
if(@name_product != 'no name') 
set @SQLstring = @SQLstring + ' AND name_product LIKE ''%' + @name_product + '%''' 
if (@final_price != 0) 
set @SQLstring = @SQLstring + ' AND first_price between @first_price AND  @final_price' 
if (@collection_1 != 'انتخاب کنید') 
set @SQLstring = @SQLstring + ' AND collection_1 = @collection_1' 
if (@id_state != 0) 
set @SQLstring = @SQLstring + ' AND id_state = @id_state ' 
set @PARAMS='@name_product nvarchar(50), 
@first_price int, 
@final_price int, 
@collection_1 nvarchar(30), 
@id_state tinyint' 
EXECUTE sp_executesql @SQLstring, 
@PARAMS, 
@name_product, 
@first_price, 
@final_price, 
@collection_1, 
@id_state 
END 
+0

К сожалению, это была не правильная работа – XXA

+0

Моя проблема в том, что если существует буксировочный продукт с таким же именем: только один продукт показывает, и это неправильно. – XXA

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