2015-08-22 4 views
-1

то, что я ищу в том, что если я решу прекратить, priceunit и т.д., это показывает мне, что часть запроса в ИНЕКЕ ..как послать правильные параметры хранимой процедуры

существует другой путь к этому?

USE [Northwind] 
GO 


ALTER PROCEDURE [dbo].[ProductosDiscontinuos] 
-- Add the parameters for the stored procedure here 
@discont bit, 
@Unit INT, 
@priceUnit INT, 
@cName VARCHAR(30), 
@CONSULTA nvarchar(MAX), 
@tipoConsulta nvarchar(MAX) 
AS 
BEGIN 

SET NOCOUNT ON; 
SELECT 
    p.ProductName, 
    s.CompanyName, 
    p.QuantityPerUnit, 
    p.UnitPrice, 
    p.UnitsInStock, 
    p.UnitsOnOrder, 
    p.ReorderLevel, 
    p.Discontinued, 
    c.CategoryName, 
    c.Description 
FROM 
    dbo.Categories c 
INNER JOIN 
    dbo.Products p ON 
    c.CategoryID=p.CategoryID 
INNER JOIN 
    Suppliers s ON 
    p.SupplierID=s.SupplierID 
WHERE 
@tipoConsulta = 
    (CASE 
    WHEN @CONSULTA='discontinued' THEN '[email protected]' 
    WHEN @CONSULTA='UnitsOnOrder' THEN 'p.UnitsOnOrder > @Unit' 
    WHEN @CONSULTA='UnitPrice' THEN 'p.UnitPrice > @priceUnit' 
    WHEN @CONSULTA ='CompanyNAme' THEN 's.CompanyNAme Like %@cName%' 
    END) 
END 

Выполнить Скрипт ...

USE [Northwind] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[ProductosDiscontinuos] 
    @discont = 1, 
    @Unit = NULL, 
    @priceUnit = NULL, 
    @cName = NULL, 
    @CONSULTA = N'discontinued', 
    @tipoConsulta = N'discontinued' 

SELECT 'Return Value' = @return_value 

, но он не показывает мне что-нибудь !!

+1

Возможно, вам нужно использовать Dynamic-SQL – lad2025

+1

Предложение WHERE всегда будет ложным, 'WHERE 'прекращено' = 'p.Discontinued = @ discont'' – lad2025

ответ

0
... 
WHERE 
    CASE 
     WHEN @CONSULTA = 'discontinued' AND p.Discontinued = @discont THEN 1 
     WHEN @CONSULTA = 'UnitsOnOrder' AND p.UnitsOnOrder > @Unit THEN 1 
     WHEN @CONSULTA = 'UnitPrice' AND p.UnitPrice > @priceUnit THEN 1 
     WHEN @CONSULTA = 'CompanyNAme' AND s.CompanyNAme LIKE '%' + @cName + '%' THEN 1 
    END = 1 

Эти виды запросов, обычно не очень эффективным, но он должен делать то, что вы просите. Кроме того, некоторые из ваших заглавных букв являются непоследовательными, и я просто оставил их, как и у вас. И, наконец, я изменил ваше выражение LIKE, чтобы правильно совместить проценты символов.

+0

Да, я конкатенирую неправильное выражение LIKE Thanx !, и почему это не эффективный? для исполнения – ger

+1

Там нет способа использовать индекс, потому что он не будет знать, в какой столбец вы собираетесь фильтровать. – shawnt00

1

Один из способов - создать динамический запрос или просто использовать IF THEN ELSE.

ALTER PROCEDURE [dbo].[ProductosDiscontinuos] 
    @discont bit, 
    @Unit INT, 
    @priceUnit INT, 
    @cName VARCHAR(30), 
    @CONSULTA nvarchar(MAX), 
    @tipoConsulta nvarchar(MAX) 
AS 
BEGIN 
SET NOCOUNT ON; 

IF @CONSULTA = N'discontinued' THEN 
BEGIN 
    SELECT 
     p.ProductName, 
     s.CompanyName, 
     p.QuantityPerUnit, 
     p.UnitPrice, 
     p.UnitsInStock, 
     p.UnitsOnOrder, 
     p.ReorderLevel, 
     p.Discontinued, 
     c.CategoryName, 
     c.Description 
    FROM dbo.Categories c 
    INNER JOIN dbo.Products p 
     ON c.CategoryID=p.CategoryID 
    INNER JOIN Suppliers s 
     ON p.SupplierID=s.SupplierID 
    WHERE 
     [email protected] 
END 
ELSE IF @CONSULTA = N'UnitsOnOrder' THEN 
BEGIN 
    /* SELECT */ 
    WHERE 
    p.UnitsOnOrder > @Unit 
END 
ELSE IF @CONSULTA = N'UnitPrice' THEN 
BEGIN 
    /* SELECT */ 
    WHERE 
    p.UnitPrice > @priceUnit 
END 
ELSE 
BEGIN 
    /* SELECT */ 
    WHERE 
    s.CompanyNAme Like %@cName%  /* This is definetely non-SARGable; poor performance */ 
END 

END

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