#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
Я хочу написать хранимую процедуру t-sql (она же sproc), которая выбирает 3 столбца из «MyTable». Кроме того, я хочу обновить таблицу в том же sproc:
- Я выбираю третье значение из таблицы.
- Если оно равно «true», я хочу обновить соответствующую запись в таблице до «false»
Я не был уверен, какой синтаксис мне следует использовать. Не могли бы вы мне помочь?
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 (а не обновленное значение).
Комментарии:
1. «пользовательская процедура (она же usp)» не является общепринятой терминологией — хранимые процедуры (они же «sprocs») обычно не различаются между пользователем и системой. Системные sprocs существуют, но поскольку у вас нет доступа для их изменения, различие является спорным.
Ответ №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. Спасибо. Я хочу вернуть исходное значение Col3 (а не обновленное значение).
2. @Elad Benda: Затем измените порядок запросов в обратном порядке. Обновил ответ в соответствии с требованиями, хотя это, конечно, не было очевидно или упоминалось изначально.
3. Спасибо. Просто для любопытства: как я могу выбрать некоторые значения из таблицы, а некоторые из переменных sql? (Я понимаю, что мой вопрос был неясен — я думаю, мне следовало повторить его не только в названии)
4. @Elad Benda: отправьте новый вопрос и предоставьте псевдокод или как можно больше TSQL.
5. Но в этом вопросе есть необходимый tsql: я устанавливаю переменную «@Col3», а затем хочу ее получить. Мой выбор получает Col1, Col2 и «@col3». Я понимаю, что вы обошли его, как и следовало, но я хочу узнать, как это сделать в целом
Ответ №2:
Если вы используете SQL Server 2005 или более поздней версии, вы можете использовать предложение 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;