我正在尝试将整个存储过程作为字符串执行,因为我必须使条件动态化。 这是我的代码:
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
按ProductID
和BrandID
进行过滤是可选的(如果它们的值不是-1,则将这些条件添加到where子句)。并且必须使用VoucherType进行过滤。问题是我无法在行中获取参数@VoucherType
的值:
SET @Condition=' WHERE VoucherType=@VoucherType '
错误表示没有列名为SI(这是我@VoucherType
的输入)。
如何获取该参数的值。
答案 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