2015-04-03 68 views
0

我试图在C#项目中使用此存储过程,其中我发送的参数用于确定哪种SQL查询将要执行可以使用,但在尝试刷新数据源在C#中,它永远不会返回任何记录:在C#中使用带有T-SQL IF/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') 
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没有被使用,这些参数就可以工作,但是我需要这样做,以便根据需要改变查询,除非有更好的选项,非常感谢您的帮助!

+0

我很困惑......如果这是一个存储过程,则不会在C#代码只是调用存储过程本身?为什么存储过程中的代码*与C#代码的视角有所不同? – David 2015-04-03 22:22:54

+0

尝试它比在这里询问要快,但是他们(参数)应该按预期工作。不要紧,你如何在存储过程中使用这些参数。只是通过它们 – Steve 2015-04-03 22:26:11

+0

我从数据源配置向导调用存储过程时,当我尝试测试它,我得到一个错误,说没有记录已被返回,但是,如果我测试SQL服务器中的存储过程,它的工作原理。在使用新参数包含IF/ELSE之前,C#中的存储过程工作良好,但现在不是,所以如果C#支持使用params进行这种评估,那么我就是在这样做。谢谢。 – saman0suke 2015-04-03 22:33:56

回答

0

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

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 
+0

我试图避免添加这些**和a.NOMBRE_PRODUCTO LIKE'%'+ @productName +'%'AND a.COD_PRODUCTO = @ productCode **为“AND”子句,因为不是所有这些参数都将被使用。 – saman0suke 2015-04-03 23:19:33

+0

也许这个想法可以帮助:http://stackoverflow.com/questions/12845191/sql-conditional-and-in-where – EternalLearner 2015-04-03 23:39:14

0

我不是在存储过程和C#的专家,不知何故,这一点:

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

而不能正常工作,所以不是这样做,我拖欠该值设为NULL而不是“”,这样做,:

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

而且它在C#中检索数据,现在,我看不出它的逻辑,但它的作品,谢谢!

1

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

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

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

0

当你原谅通参数值那个时候采取自动空

那么我们有两种解决方案在这里。

月1日是定义默认“”(空白)

@productName nvarchar(255) = '' 

第二个你应该检查一下空或不是,如果它为null,则改为“”(空白)。

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 
相关问题