我想编写一个t-sql存储过程(aka sproc),它从'MyTable'中选择3列。另外,我想在同一个sproc中更新表:
我不确定我应该使用什么语法。你能救我一下吗?
ALTER procedure [dbo].[My_PROC]
@ID varchar(10)
AS
BEGIN
declare @Col3 bit;
set @Col3 = select Col3
from dbo.MyTable with (nolock)
where @ID = ID
if @Col3 = 'true'
update dbo.dbo.MyTable set col3 = 'false'
where @ID = ID
select Col1,
Col2,
Col3
from dbo.MyTable table with (nolock) where @ID = ID,
table.Col1,
table.Col2,
@Col3
END
编辑:我想返回原始Col3 (不是更新后的值)。
答案 0 :(得分:1)
使用:
ALTER procedure [dbo].[My_PROC]
@ID varchar(10)
AS
BEGIN
SELECT t.col1,
t.col2,
t.col3
FROM dbo.MyTable AS t WITH (NOLOCK)
WHERE t.id = @ID
-- No need for an IF statement to determine updating...
UPDATE dbo.dbo.MyTable
SET col3 = 'false'
WHERE id = @ID
AND t.col3 = 'true'
END
我不知道您对最终SELECT
的意图是什么,但是一旦我理解了您的意图,我就可以更新它。
答案 1 :(得分:0)
如果您使用的是SQL Server 2005或更高版本,则可以使用OUTPUT子句输出原始值(如果查询实际更新了该值)。但是,如果查询未更新行,OUTPUT将不会为您提供原始值。
declare @t table (
ID int,
tf bit
);
insert into @t values
(1,0),
(2,1),
(3,0);
declare @ID int = 2;
select * from @t
update @t set
tf = 0
output deleted.ID, deleted.tf
where ID = @ID;
select * from @t;