2015-01-11 14 views
1

我有一些数据表。其中一列被命名为“类别”,并包含SKI或SB等数据。如何验证列? SQL

我有一个函数来验证和一个过程。 我只需要获得类别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 @[email protected] 
    SELECT Category, Model 
    FROM PRODUCTS 
    WHERE dbo.validateProducts(@productCategory) = 1 
END 
GO 

EXEC usp_ProductsRead @productType='SKI' 
+0

这看起来像SQL Server语法,所以我删除了MySQL的标签。 –

+0

你的代码有什么问题?你有错误吗? –

+0

不,我没有得到错误。它显示我所有的数据......不仅是'SKI'类别 – user3671805

回答

0

再添加一个condtion在where子句否则你会得到所有的表时,你通过@productCategory ='SKI'

CREATE PROCEDURE usp_ProductsRead(@productType NVARCHAR(50)) AS 
BEGIN 
    SELECT Category, Model 
    FROM PRODUCTS 
    WHERE dbo.validateProducts(@productType) = 1 and [email protected] 
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 [email protected] 
end 
else 
Begin 
    Print 'Category is not SKI' 
End 
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;