我如何验证列? SQL

时间:2015-01-11 16:58:37

标签: sql sql-server validation

我有一张包含一些数据的表格。其中一列名为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'

2 个答案:

答案 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;