我有一张包含一些数据的表格。其中一列名为Category,包含SKI或SB等数据。
我有一个验证和程序的功能。 我只需要获得带有类别SKI的列。我知道还有其他简单的方法可以实现这个...但我有一个赋值,这就是我使用函数和过程的原因。
我做错了什么?
CREATE FUNCTION validateProducts(@productCategory NVARCHAR(50))
RETURNS BIT AS
BEGIN
DECLARE @returnValue BIT
IF(@productCategory LIKE 'SKI')
SET @returnValue = 1 --valid
ELSE
SET @returnValue = 0 --invalid
RETURN @returnValue
END
GO
CREATE PROCEDURE usp_ProductsRead(@productType NVARCHAR(50)) AS
BEGIN
DECLARE @productCategory NVARCHAR(50)
SET @productCategory=@productType
SELECT Category, Model
FROM PRODUCTS
WHERE dbo.validateProducts(@productCategory) = 1
END
GO
EXEC usp_ProductsRead @productType='SKI'
答案 0 :(得分:0)
在where
子句中再添加一个条件,否则当您通过@productCategory ='SKI'
CREATE PROCEDURE usp_ProductsRead(@productType NVARCHAR(50)) AS
BEGIN
SELECT Category, Model
FROM PRODUCTS
WHERE dbo.validateProducts(@productType) = 1 and Category=@productType
END
GO
或检查函数返回的值,然后选择PRODUCTS
表
CREATE PROCEDURE usp_ProductsRead(@productType NVARCHAR(50)) AS
BEGIN
if (select dbo.validateProducts(@productType))=1
Begin
SELECT Category, Model
FROM PRODUCTS
WHERE Category=@productType
end
else
Begin
Print 'Category is not SKI'
End
答案 1 :(得分:0)
当然它返回所有类别,因为where
中的条件不在表中的行上。它是传入的值。因此,如果该值匹配,则返回所有行。如果值不匹配,则不返回任何行。
您需要在表中存储的Cateogry
上运行该功能。我不确定是哪一列,但这是一个猜测:
CREATE PROCEDURE usp_ProductsRead AS
BEGIN
SELECT p.Category, p.Model
FROM PRODUCTS p
WHERE dbo.validateProducts(p.Category) = 1
END;
EXEC dbo.usp_ProductsRead;