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语句。