我试图在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,参数会起作用,但我需要这样做才能根据需要改变查询,除非有更好的选择,非常感谢你的帮助!
答案 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