如何将正确的参数发送到存储过程

how to send a correct parameters to a stored procedure

我正在寻找的是,如果我选择 discontinued、priceunit 等,它会向我显示 where 子句中的查询部分..

还有另一种方法吗?

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 'p.Discontinued=@discont'
    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

但它没有显示任何内容!!

一种方法是构建动态查询或仅使用 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 
        p.Discontinued=@discont
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

结束

...
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 表达式以正确连接百分比字符。