在带有参数的C#中使用带有T-SQL IF / ELSE的存储过程

时间:2015-04-03 22:20:54

标签: c# sql-server stored-procedures

我试图在C#项目中使用此存储过程,其中我发送的参数用于确定将使用哪种SQL查询,但在尝试使用C#刷新数据源时,它永远不会返回任何记录:

IF(@productName = '' AND @productCode = '')
BEGIN
    SELECT  a.COD_PRODUCTO, 
                    a.NOMBRE_PRODUCTO, 
                    CONVERT(DECIMAL(10, 2), b.PRECIO_UNITARIO) AS PRECIO_UNITARIO, 
                    CONVERT(INT, a.UNIDADES_DISPONIBL) AS UNIDADES_DISPONIBL, 
                    CONVERT(INT, a.UNIDADES_TRANSITO) AS UNIDADES_TRANSITO,
                    b.TIPO_CLIENTE,
                    b.NUM_EMPRESA
    FROM sysadm.IN_PRODUCTOS a INNER JOIN sysadm.IN_PRECIOS_TIPOCLT b
      ON a.COD_PRODUCTO = b.COD_PRODUCTO
     AND a.NUM_EMPRESA = b.NUM_EMPRESA
     AND b.TIPO_CLIENTE = @ClientType
     AND B.NUM_EMPRESA NOT IN('50', '60')
END
ELSE IF (@productName <> '' AND @productCode = '')
BEGIN
    SELECT  a.COD_PRODUCTO, 
                    a.NOMBRE_PRODUCTO, 
                    CONVERT(DECIMAL(10, 2), b.PRECIO_UNITARIO) AS PRECIO_UNITARIO, 
                    CONVERT(INT, a.UNIDADES_DISPONIBL) AS UNIDADES_DISPONIBL, 
                    CONVERT(INT, a.UNIDADES_TRANSITO) AS UNIDADES_TRANSITO,
                    b.TIPO_CLIENTE,
                    b.NUM_EMPRESA
    FROM sysadm.IN_PRODUCTOS a INNER JOIN sysadm.IN_PRECIOS_TIPOCLT b
      ON a.COD_PRODUCTO = b.COD_PRODUCTO
     AND a.NUM_EMPRESA = b.NUM_EMPRESA
     AND b.TIPO_CLIENTE = @ClientType
     AND B.NUM_EMPRESA NOT IN('50', '60')
     AND a.NOMBRE_PRODUCTO LIKE '%' + @productName + '%'
END
ELSE IF (@productName = '' AND @productCode <> '')
BEGIN
    SELECT  a.COD_PRODUCTO, 
                    a.NOMBRE_PRODUCTO, 
                    CONVERT(DECIMAL(10, 2), b.PRECIO_UNITARIO) AS PRECIO_UNITARIO, 
                    CONVERT(INT, a.UNIDADES_DISPONIBL) AS UNIDADES_DISPONIBL, 
                    CONVERT(INT, a.UNIDADES_TRANSITO) AS UNIDADES_TRANSITO,
                    b.TIPO_CLIENTE,
                    b.NUM_EMPRESA
    FROM sysadm.IN_PRODUCTOS a INNER JOIN sysadm.IN_PRECIOS_TIPOCLT b
      ON a.COD_PRODUCTO = b.COD_PRODUCTO
     AND a.NUM_EMPRESA = b.NUM_EMPRESA
     AND b.TIPO_CLIENTE = @ClientType
     AND B.NUM_EMPRESA NOT IN('50', '60')
     AND a.COD_PRODUCTO = @productCode
END

END

是否可以使用这样的参数?如果没有使用IF / ELSE,参数会起作用,但我需要这样做才能根据需要改变查询,除非有更好的选择,非常感谢你的帮助!

4 个答案:

答案 0 :(得分:1)

在我看来,我会创建三个不同的存储过程。您目前编写的代码将起作用,但将来不安全。

在未来的开发中,您很可能会再次重新编写代码,因为它不是动态的。

这就是为什么你可以在C#端移动你的if else语句。

答案 1 :(得分:0)

请记住保持简单的解决方案。如果/ ELSE语句阻止您的代码工作?只是摆脱尝试不同的方法。也许最好只保留一个选择块,你仍然可以确定哪个选项是NRO_QUERY值的当前值,并且如果您在C#中操作结果,那么可以很容易地检查该值(如任何一个选项)的有效值。 。 这是我的建议:

BEGIN  
SELECT  a.COD_PRODUCTO,   
a.NOMBRE_PRODUCTO,   
CONVERT(DECIMAL(10, 2), b.PRECIO_UNITARIO) AS PRECIO_UNITARIO,   
CONVERT(INT, a.UNIDADES_DISPONIBL) AS UNIDADES_DISPONIBL,   
CONVERT(INT, a.UNIDADES_TRANSITO) AS UNIDADES_TRANSITO,  
b.TIPO_CLIENTE,  
b.NUM_EMPRESA  
FROM sysadm.IN_PRODUCTOS a INNER JOIN sysadm.IN_PRECIOS_TIPOCLT b  
ON a.COD_PRODUCTO = b.COD_PRODUCTO  
AND a.NUM_EMPRESA = b.NUM_EMPRESA  
AND b.TIPO_CLIENTE = @ClientType  
AND B.NUM_EMPRESA NOT IN('50', '60')  
AND a.NOMBRE_PRODUCTO LIKE '%' + @productName + '%'  
AND a.COD_PRODUCTO = @productCode  
CASE  
WHEN (@productName = '' AND @productCode = '') THEN 1  
WHEN (@productName <> '' AND @productCode = '') THEN 2   
WHEN (@productName = '' AND @productCode <> '') THEN 3  
END AS NRO_QUERY  
END

答案 2 :(得分:0)

我不是存储过程和C#的专家,不知怎的,这个:

(@productName <> '' AND @productCode = '')

无法正常工作,所以我没有这样做,而是将值默认为NULL而不是''并执行此操作:

IF(@productName IS NULL AND @productCode IS NULL)

它现在在C#中检索数据,我没有看到它的逻辑,但是它有效,谢谢!

答案 3 :(得分:0)

当您原谅pass参数值时,它会自动为空

然后我们在这里有两个解决方案。

第一个是定义默认&#39;&#39; (空白)

@productName nvarchar(255) = ''   

第二个你应该检查它是否为null如果它为null然后改为&#39;&#39;(空白)。

IF(isnull(@productName,'') = '' AND isnull(@productCode,'') = '')

试试这段代码:

IF(isnull(@productName,'') = '' AND isnull(@productCode,'') = '')
BEGIN
    SELECT  a.COD_PRODUCTO, 
                    a.NOMBRE_PRODUCTO, 
                    CONVERT(DECIMAL(10, 2), b.PRECIO_UNITARIO) AS PRECIO_UNITARIO, 
                    CONVERT(INT, a.UNIDADES_DISPONIBL) AS UNIDADES_DISPONIBL, 
                    CONVERT(INT, a.UNIDADES_TRANSITO) AS UNIDADES_TRANSITO,
                    b.TIPO_CLIENTE,
                    b.NUM_EMPRESA
    FROM sysadm.IN_PRODUCTOS a INNER JOIN sysadm.IN_PRECIOS_TIPOCLT b
      ON a.COD_PRODUCTO = b.COD_PRODUCTO
     AND a.NUM_EMPRESA = b.NUM_EMPRESA
     AND b.TIPO_CLIENTE = @ClientType
     AND B.NUM_EMPRESA NOT IN('50', '60')
END
ELSE IF(isnull(@productName,'') <> '' AND isnull(@productCode,'') = '')
BEGIN
    SELECT  a.COD_PRODUCTO, 
                    a.NOMBRE_PRODUCTO, 
                    CONVERT(DECIMAL(10, 2), b.PRECIO_UNITARIO) AS PRECIO_UNITARIO, 
                    CONVERT(INT, a.UNIDADES_DISPONIBL) AS UNIDADES_DISPONIBL, 
                    CONVERT(INT, a.UNIDADES_TRANSITO) AS UNIDADES_TRANSITO,
                    b.TIPO_CLIENTE,
                    b.NUM_EMPRESA
    FROM sysadm.IN_PRODUCTOS a INNER JOIN sysadm.IN_PRECIOS_TIPOCLT b
      ON a.COD_PRODUCTO = b.COD_PRODUCTO
     AND a.NUM_EMPRESA = b.NUM_EMPRESA
     AND b.TIPO_CLIENTE = @ClientType
     AND B.NUM_EMPRESA NOT IN('50', '60')
     AND a.NOMBRE_PRODUCTO LIKE '%' + @productName + '%'
END
ELSE IF(isnull(@productName,'') = '' AND isnull(@productCode,'') <> '')
BEGIN
    SELECT  a.COD_PRODUCTO, 
                    a.NOMBRE_PRODUCTO, 
                    CONVERT(DECIMAL(10, 2), b.PRECIO_UNITARIO) AS PRECIO_UNITARIO, 
                    CONVERT(INT, a.UNIDADES_DISPONIBL) AS UNIDADES_DISPONIBL, 
                    CONVERT(INT, a.UNIDADES_TRANSITO) AS UNIDADES_TRANSITO,
                    b.TIPO_CLIENTE,
                    b.NUM_EMPRESA
    FROM sysadm.IN_PRODUCTOS a INNER JOIN sysadm.IN_PRECIOS_TIPOCLT b
      ON a.COD_PRODUCTO = b.COD_PRODUCTO
     AND a.NUM_EMPRESA = b.NUM_EMPRESA
     AND b.TIPO_CLIENTE = @ClientType
     AND B.NUM_EMPRESA NOT IN('50', '60')
     AND a.COD_PRODUCTO = @productCode
END