2015-01-11 32 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;