Sql 存储过程中的更新

Sql 存储过程中的更新,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在尝试接收NICnumber of employee,这是他们的ID号,并根据时间段从一个团队更改为另一个团队 因此,我有4个团队负责开发一个软件,每个员工可以在不同的时间段参与不同的团队。例如,我有一个员工NIC编号54323,属于3个不同的组。但当我执行查询时,显示1行受影响,但当我执行select*from StuffTeams,其中NIC=54323时,它并没有改变任何内容 CREATE OR ALTER PROCEDURE sp_TransferTeam @NIC int,

我正在尝试接收
NIC
number of employee,这是他们的ID号,并根据时间段从一个团队更改为另一个团队

因此,我有4个团队负责开发一个软件,每个员工可以在不同的时间段参与不同的团队。例如,我有一个员工
NIC
编号54323,属于3个不同的组。但当我执行查询时,显示1行受影响,但当我执行
select*from StuffTeams,其中NIC=54323
时,它并没有改变任何内容

CREATE OR ALTER PROCEDURE sp_TransferTeam
    @NIC int,
    @IDTeam1 int,
    @IDTeam2 int,
    @StartDate date,
    @EndDate date
AS
BEGIN
    SELECT @NIC = NIC 
    FROM StuffTeams 
    WHERE IDTeam = @IDTeam1 

    UPDATE StuffTeams 
    SET IDTeam = @IDTeam2 
    WHERE NIC = @NIC 
      AND DateStart = @StartDate 
      AND DateFinish = @EndDate
END

EXEC sp_TransferTeam 54323, 4, 2, '2017-08-01', '2017-10-01'
填充团队表:

CREATE TABLE StuffTeams
(
    IDStuffTeam nvarchar(30) NOT NULL,
    IDTeam int NOT NULL,
    NIC int NOT NULL,
    DateStart date NOT NULL,
    DateFinish date NOT NULL,
    CONSTRAINT PK_Stuff PRIMARY KEY (IDStuffTeam),
    CONSTRAINT FK_sTeam FOREIGN KEY (IDTeam) REFERENCES Teams (IDTeam),
    CONSTRAINT FK_sNIC FOREIGN KEY (NIC) REFERENCES Employees (NIC),
)
CREATE TABLE Teams 
(
    IDTeam int NOT NULL,
    IDProduct int NOT NULL,
    TeamName nvarchar(30) NOT NULL,
    DateStart date NOT NULL,
    DateFinish date NOT NULL,
    CONSTRAINT PK_Team PRIMARY KEY (IDTeam),
    CONSTRAINT FK_IDProduct FOREIGN KEY (IDProduct) REFERENCES Products (IDProduct)
)
在任何情况下,团队表:

CREATE TABLE StuffTeams
(
    IDStuffTeam nvarchar(30) NOT NULL,
    IDTeam int NOT NULL,
    NIC int NOT NULL,
    DateStart date NOT NULL,
    DateFinish date NOT NULL,
    CONSTRAINT PK_Stuff PRIMARY KEY (IDStuffTeam),
    CONSTRAINT FK_sTeam FOREIGN KEY (IDTeam) REFERENCES Teams (IDTeam),
    CONSTRAINT FK_sNIC FOREIGN KEY (NIC) REFERENCES Employees (NIC),
)
CREATE TABLE Teams 
(
    IDTeam int NOT NULL,
    IDProduct int NOT NULL,
    TeamName nvarchar(30) NOT NULL,
    DateStart date NOT NULL,
    DateFinish date NOT NULL,
    CONSTRAINT PK_Team PRIMARY KEY (IDTeam),
    CONSTRAINT FK_IDProduct FOREIGN KEY (IDProduct) REFERENCES Products (IDProduct)
)

非常感谢

您应该将@NIC声明为变量而不是参数,然后在第一次查询中设置它。调试的一个好方法是在SP外部使用where子句选择记录,然后查看是否选择了所有目标记录

SELECT * FROM StuffTeams
    WHERE NIC = 54323 
      AND DateStart = '2017-08-01' 
      AND DateFinish = '2017-10-01'

试着运行这个,看看它是否返回您想要更新的记录。您的where子句可能正在将它们过滤掉。如果不是这样,请尝试将传递日期的日期格式更改为MM-DD-YYYY。

您应该将@NIC声明为变量而不是参数,然后在第一次查询中设置它。调试的一个好方法是在SP外部使用where子句选择记录,然后查看是否选择了所有目标记录

SELECT * FROM StuffTeams
    WHERE NIC = 54323 
      AND DateStart = '2017-08-01' 
      AND DateFinish = '2017-10-01'
试着运行这个,看看它是否返回您想要更新的记录。您的where子句可能正在将它们过滤掉。如果不是这样,请尝试将传递日期的日期格式更改为MM-DD-YYYY。

如下编辑sp

CREATE OR ALTER PROCEDURE sp_TransferTeam
    @NIC int,
    @IDTeam1 int,
    @IDTeam2 int,
    @StartDate date,
    @EndDate date
AS
BEGIN
    UPDATE StuffTeams 
    SET IDTeam = @IDTeam2 
    WHERE NIC = @NIC 
      AND DateStart = @StartDate 
      AND DateFinish = @EndDate
END

EXEC sp_TransferTeam 54323, 4, 2, '2017-08-01', '2017-10-01'
然后从外部选择以查看结果

如下编辑sp

CREATE OR ALTER PROCEDURE sp_TransferTeam
    @NIC int,
    @IDTeam1 int,
    @IDTeam2 int,
    @StartDate date,
    @EndDate date
AS
BEGIN
    UPDATE StuffTeams 
    SET IDTeam = @IDTeam2 
    WHERE NIC = @NIC 
      AND DateStart = @StartDate 
      AND DateFinish = @EndDate
END

EXEC sp_TransferTeam 54323, 4, 2, '2017-08-01', '2017-10-01'


然后从外部选择以查看结果

您正在将@NIC作为参数传递到proc中,但随后它会立即被proc中的第一个查询重置。但是如果我不将@NIC作为参数,我如何在不接收NIC编号的情况下执行如果您将@NIC的值作为参数传递,那么,在执行过程之前,您已经知道了该值。但是,您可能会在第一个查询中重置该值,因为它依赖于您传递的其他参数值。旁注:您不应该在存储过程中使用
sp\uu
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!非常感谢您的提醒!以前有人已经告诉过我这一点,但我的教授希望存储过程作为sp_uu,触发器作为tr_uu。这就是为什么我这样使用的原因…您将@NIC作为参数传递到proc中,但它会立即被proc中的第一个查询重置。但是如果我不将@NIC作为参数,我如何在不接收NIC员工数的情况下执行?如果您将@NIC的值作为参数传递,那么,在执行过程之前,您已经知道了该值。但是,您可能会在第一个查询中重置该值,因为它依赖于您传递的其他参数值。旁注:您不应该在存储过程中使用
sp\uu
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!非常感谢您的提醒!以前有人已经告诉过我这一点,但我的教授希望存储过程作为sp_uu,触发器作为tr_uu。这就是为什么我要这样使用…但如果我这样使用,我也不能为其他员工执行。每次我想搜索一个查询时,我都必须更改sp。我试图将其作为查询来执行,但没有结果。。当我声明@NIC时,有一个错误说;过程或函数sp_TransferTeam指定的参数太多。因为我不能在exec QUERY中输入NIC号码,请发布您试图更新的记录好吗?如果查询没有返回任何内容,那么where子句可能是错误的,它会过滤掉要更新的记录。查询应已返回要更新的记录。很抱歉造成混淆,我不是说你要把它添加到你的最终SP中,我是说把它作为一个查询运行,只是为了测试。但是如果我这样使用,我也不能为其他员工执行。每次我想搜索一个查询时,我都必须更改sp。我试图将其作为查询来执行,但没有结果。。当我声明@NIC时,有一个错误说;过程或函数sp_TransferTeam指定的参数太多。因为我不能在exec QUERY中输入NIC号码,请发布您试图更新的记录好吗?如果查询没有返回任何内容,那么where子句可能是错误的,它会过滤掉要更新的记录。查询应已返回要更新的记录。很抱歉给您带来困惑,我不是说您要将其添加到最终SP中,我是说将其作为一个查询运行,仅用于测试目的。非常感谢!它解决了我的问题,但是你能简单地解释一下为什么我不应该在SPX中使用select吗?问题是你的select语句正在更改@nic。如果您删除它,您也可以在sp中使用select语句。非常感谢!它解决了我的问题,但是你能简单地解释一下为什么我不应该在SPX中使用select吗?问题是你的select语句正在更改@nic。如果删除该语句,还可以在sp中使用select语句。