2015-11-29 55 views
-2

我试图从不是服务器的员工创建阻止订单。这是我的diagram该项目。我的代码,我创建运行正常,但我还可以凭谁不是在“服务器”练习SQL CHECK CONSTRAINT with FUNCTION

CREATE FUNCTION dbo.chk_server_position(@employee_ID int) 
RETURNS varchar(50) 
AS 
BEGIN 
    DECLARE @position varchar(50); 
    DECLARE @employeeID int; 
    DECLARE @output varchar(50); 
    SELECT @position = employee.position, @employeeID = orderInfo.employee_ID 
    FROM employee, orderInfo 
    WHERE employee.employee_ID = orderInfo.employee_ID 
    IF (@position = 'server') 
     SET @output = 'true' 
    return @output; 
END; 
GO 

ALTER TABLE orderInfo 
ADD CONSTRAINT chk_position CHECK (dbo.chk_server_position(employee_ID) = 'true') 

显然,我已经改变了代码,这

CREATE FUNCTION dbo.chk_server_position(@employee_ID int) 
RETURNS varchar(50) 
AS 
BEGIN 
    DECLARE @position varchar(50); 
    DECLARE @employeeID int; 
    DECLARE @output varchar(50); 
    SET @employeeID = (SELECT employee_ID FROM orderInfo) 
    SET @position = (SELECT position FROM employee, orderInfo 
        WHERE employee.employee_ID = orderInfo.employee_ID AND employee.employee_ID = @employee_ID) 

    IF (@position = 'server') 
     SET @output = 'true' 
    return @output; 
END; 
GO 

员工插入和现在,我得到错误信息 子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。 运行

ALTER TABLE orderInfo 
ADD CONSTRAINT chk_position CHECK (dbo.chk_server_position(employee_ID) = 'true') 

哪种方法更接近导致什么时候?

回答

0

没关系,我解决了这个问题TRIGGER

CREATE TRIGGER check_employee_position 
ON orderInfo 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @position VARCHAR(50); 
    DECLARE @employeeID INT = (SELECT i.employee_ID FROM inserted i); 
    SET @position = (SELECT position FROM employee WHERE employee_ID = @employeeID) 
    IF (@position = 'server') 
     INSERT INTO orderInfo(employee_ID, tableNo) VALUES (@employeeID, (SELECT i.tableNo FROM inserted i)) 
END 
0

由于您的“上次选择”员工不是服务器,您总是插入记录,您错过了给定员工的过滤。

您在USP的Where子句中没有使用@employee_ID参数。 修改您的where子句,如: WHERE employee.employee_ID = orderInfo.employee_ID and employee.employee_ID = @employee_ID

更新: 为什么你需要选择@EmployeeID在USP?你可以写,就像下面:

CREATE FUNCTION dbo.chk_server_position(@employee_ID int) 
RETURNS varchar(50) 
AS 
BEGIN 
    DECLARE @position varchar(50); 
    DECLARE @output varchar(50) = 'false'; 

    SELECT @position = position FROM employee 
    inner join orderInfo ON employee.employee_ID = orderInfo.employee_ID 
    WHERE employee.employee_ID = @employee_ID) 

    IF (@position = 'server') 
     SET @output = 'true' 
    return @output; 

END; 
GO 
+0

试过了,仍然无法正常工作,我仍然可以插入EMPLOYEE_ID为了谁不是“服务器“ –