【问题标题】:Using Case field as parameter column in stored procedures in SQL Server在 SQL Server 的存储过程中使用 Case 字段作为参数列
【发布时间】:2012-09-27 11:30:21
【问题描述】:
CREATE PROCEDURE [dbo].[rpt_Report]
   @Product varchar(20) = NULL,
   @From DateTime = null,
   @To DateTime = null
AS
BEGIN
    SELECT 
       CO.PO, CO.DLVRY,   
       CASE
          WHEN co.CUST_ID = '120' THEN '120' 
          WHEN HDR.PO_NO LIKE 'CL%' THEN 'CL'
          WHEN RED.REU = 'SK' THEN 'STOCK' 
          WHEN RED.REU = 'SM' THEN 'ORTS' 
          WHEN co.ITEM = 'PW%' THEN 'CHAIN' 
          WHEN co.ITEM LIKE 'D%' THEN 'VAN' ELSE 'MISC' 
       END AS PRODUCT 
     FROM   
        co AS co    
     INNER JOIN 
        HDR AS HDR ON co.NUMBER = HDR.NUMBER 
     INNER JOIN 
        RED AS RED ON co.ITEM = RED.ITEM 
     WHERE   
        (co.DLVRY BETWEEN @From AND @To) AND (@Product = PRODUCT)
     ORDER BY
        co.DLVRY DESC
END

当我执行它时,我收到一条错误消息

消息 207,级别 16,状态 1,过程 rpt_Report,第 34 行
列名“PRODUCT”无效。

我应该在 where CLAUSE 中使用 case 字段值作为参数。

【问题讨论】:

  • 尝试去掉 PRODUCT 后面的逗号
  • ... END AS Product , 中删除FROM 关键字之前的逗号 - 不需要逗号并导致此错误....
  • 嗨 devak & marc,逗号是错误添加的。即使删除逗号后,也会发生相同的错误。我需要的是 product_type 字段值,它应该在 where 子句中用作 @product 的值。但由于 Product_type 字段不是上述任何表中的列,因此它会作为无效列抛出错误。
  • PRODUCT_TYPEWHERE)和PRODUCTSELECT)是同一列吗?
  • 那么这个 PRODUCT_TYPE 列是什么。如果它不是来自任何表,那么您希望它如何获取值。

标签: sql-server-2008 stored-procedures parameters case


【解决方案1】:

您似乎试图在WHERE 子句中使用PRODUCT 别名,但您不能这样做。因此,您可以将查询包装在子查询中以使用别名:

CREATE PROCEDURE [dbo].[rpt_Report]
   @Product varchar(20) = NULL,
   @From DateTime = null,
   @To DateTime = null
AS
BEGIN
    SELECT x.PO, x.DLVRY, x.PRODUCT
    FROM
    (
        SELECT CO.PO, CO.DLVRY,   
           CASE
              WHEN co.CUST_ID = '120' THEN '120' 
              WHEN HDR.PO_NO LIKE 'CL%' THEN 'CL'
              WHEN RED.REU = 'SK' THEN 'STOCK' 
              WHEN RED.REU = 'SM' THEN 'ORTS' 
              WHEN co.ITEM = 'PW%' THEN 'CHAIN' 
              WHEN co.ITEM LIKE 'D%' THEN 'VAN' ELSE 'MISC' 
           END AS PRODUCT 
         FROM  co AS co    
         INNER JOIN HDR AS HDR 
            ON co.NUMBER = HDR.NUMBER 
         INNER JOIN RED AS RED 
            ON co.ITEM = RED.ITEM 
    ) x        
    WHERE (x.DLVRY BETWEEN @From AND @To) 
        AND (@Product = PRODUCT)
    ORDER BY x.DLVRY DESC
END

【讨论】:

  • 你确定你有数据吗?你能用一些样本数据创建一个sql fiddle吗?
  • 没有 Product 参数我可以获取数据
  • @sateesh 如果您在存储过程之外运行查询,它是否与参数一起使用?
  • 我没有使用@Product 作为参数
  • @sateesh 你能发布一些示例数据或创建一个SQL Fiddle吗?或者在有空格的情况下将RTRIM()/LTRIM() 放在WHERE 子句中的PRODUCT 值周围>
【解决方案2】:

试试这个:

SELECT 
   CO.PO, CO.DLVRY,   
   PRODUCT = CASE
                WHEN co.CUST_ID = '120' THEN '120' 
                WHEN HDR.PO_NO LIKE 'CL%' THEN 'CL'
                WHEN RED.REU = 'SK' THEN 'STOCK' 
                WHEN RED.REU = 'SM' THEN 'ORTS' 
                WHEN co.ITEM = 'PW%' THEN 'CHAIN' 
                WHEN co.ITEM LIKE 'D%' THEN 'VAN' ELSE 'MISC' 
             END 
 FROM   
    co AS co    
 INNER JOIN 
    HDR AS HDR ON co.NUMBER = HDR.NUMBER 
 INNER JOIN 
    RED AS RED ON co.ITEM = RED.ITEM 
 WHERE   
    (co.DLVRY BETWEEN @From AND @To) AND (@Product = PRODUCT)
 ORDER BY
    co.DLVRY DESC

希望这会有所帮助!

【讨论】:

  • 我尝试了这种方法,但我得到“必须声明标量变量“@Product”。”作为错误。
  • @sateesh,这是一个示例sqlfiddle.com/#!3/a6816/2,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多