在exec()中使用varchar参数

时间:2013-11-12 12:53:50

标签: sql sql-server stored-procedures parameter-passing

我正在尝试将整个存储过程作为字符串执行,因为我必须使条件动态化。 这是我的代码:

CREATE PROCEDURE SP1
  (@VoucherType varchar(10),
  @ProductID bigint,
  @BrandID bigint)
AS
BEGIN

DECLARE @Condition as varchar(300)
SET @Condition=' WHERE VoucherType=@VoucherType '
IF (@ProductID<>-1)
  BEGIN
  SET @Condition=@Condition+' AND ProductID='+cast(@ProductID as varchar)
  END
IF (BrandID<>-1)
  BEGIN
  SET @Condition=@Condition+' AND BrandID='+cast(@BrandID as varchar)
  END
EXEC('SELECT * FROM Products '+@Condition)

END

ProductIDBrandID进行过滤是可选的(如果它们的值不是-1,则将这些条件添加到where子句)。并且必须使用VoucherType进行过滤。问题是我无法在行中获取参数@VoucherType的值:

SET @Condition=' WHERE VoucherType=@VoucherType '

错误表示没有列名为SI(这是我@VoucherType的输入)。 如何获取该参数的值。

4 个答案:

答案 0 :(得分:1)

只需在没有动态SQL的情况下执行此操作:

SELECT * FROM Products WHERE VoucherType=@VoucherType AND 
  (@ProductID=-1 OR  ProductID=@ProductID)
  AND 
  (@BrandID=-1 OR  BrandID=@BrandID)

答案 1 :(得分:1)

如果逻辑与您描述的一样,您可以在没有动态SQL的情况下执行此操作 - 只需使用where子句中的参数,方法是使用与每个参数的默认值进行比较(实际上将where子句的一部分设为no) -op如果值是用于表示“不过滤”的信号值。)

CREATE PROCEDURE Sp1
(
  @VoucherType VARCHAR(10),
  @ProductID   BIGINT,
  @BrandID     BIGINT
)
AS
  BEGIN
      SELECT *
      FROM   Products
      WHERE  (@VoucherType IS NULL OR VoucherType = @VoucherType)
             AND (@ProductID = -1 OR ProductID = @ProductID)
             AND (@BrandID = -1 OR BrandID = @BrandID)
  END

请注意,您应该只选择所需的列而不是*

(如果您不希望VoucherType是可选的,因为我已在此处进行,只需删除NULL比较)

答案 2 :(得分:1)

为什么不工作?因为您正在尝试使用该参数。你需要改变这个:

SET @Condition=' WHERE VoucherType=@VoucherType '

到此:

SET @Condition=' WHERE VoucherType='' ' + @VoucherType + ''''

注意:您可以在没有动态SQL的情况下实际执行此操作。请考虑以下声明:

SELECT * FROM Products
WHERE (VoucherType = @VoucherType) AND
    (@ProductID = -1 OR ProductID = @ProductID) AND
    (@BrandID = -1 OR BrandID = @BrandID

答案 3 :(得分:0)

使用sp_executesql接收3个参数:查询,参数类型和参数值:

仅针对@VoucherType参数的简短示例:

EXEC sp_executesql N'SELECT * FROM Products WHERE VoucherType = @VoucherType',
N'@VoucherType VARCHAR(10)',
@VoucherType = @VoucherType

然后你应该为ProductID和BrandID做同样的技巧。

其他建议:

1 /使用NULL而不是-1并检查NULL:

IF BrandID IS NOT NULL

2 /根据您的物理设计,您可以在不使用sp_executesql

的情况下重写语句
SELECT * FROM Products
WHERE VoucherType=@VoucherType
AND @ProductID IS NULL OR ProductID = @ProductID
AND @BrandID IS NULL OR BrandID = @BrandID