Member 12965461 Ответов: 1

Sql question-как написать скрипт на SQL, который имеет оператор select update


Я хочу, чтобы обновить значение @BeforeValue в SYSSETTINGVALUE стол .
запрос не дает желаемого результата.
Как я могу выполнить оператор select и update один за другим в одном скрипте?

Если есть другой способ написать этот запрос ,я буду рад узнать его


Declare @BeforeValue int ;
set @BeforeValue =  DATEDIFF(DAY,DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0),getdate());


select @BeforeValue,from 
 SYSSETTING S1,
 SYSSETTINGVALUE OffsetDaysBefore,
 EtpSalesOrg
 
 where 

 S1.PKey=OffsetDaysBefore.SysSettingPKey
 AND S1.Status<>'d'
 AND OffsetDaysBefore.Status<>'d'
 AND EtpSalesOrg.id=OffsetDaysBefore.SalesOrg
 AND EtpSalesOrg.status<>'d'

 begin
 update S1,OffsetDaysBefore set OffsetDaysBefore.value='@BeforeValue'  where S1.PKey=OffsetDaysBefore.SysSettingPKey 
 and  S1.pkey='00100000007p3e4a' and S1.id='TestBefore'
 end


Что я уже пробовал:

Declare @BeforeValue int ;
set @BeforeValue =  DATEDIFF(DAY,DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0),getdate());


select @BeforeValue,from 
 SYSSETTING S1,
 SYSSETTINGVALUE OffsetDaysBefore,
 EtpSalesOrg
 
 where 

 S1.PKey=OffsetDaysBefore.SysSettingPKey
 AND S1.Status<>'d'
 AND OffsetDaysBefore.Status<>'d'
 AND EtpSalesOrg.id=OffsetDaysBefore.SalesOrg
 AND EtpSalesOrg.status<>'d'

 begin
 update S1,OffsetDaysBefore set OffsetDaysBefore.value='@BeforeValue'  where S1.PKey=OffsetDaysBefore.SysSettingPKey 
 and  S1.pkey='00100000007p3e4a' and S1.id='TestBefore'
 end

Santosh kumar Pithani

почему вы выбрали этот столбец "@BeforeValue" в качестве столбца?

1 Ответов

Рейтинг:
11

Santosh kumar Pithani

Declare @BeforeValue int;
set @BeforeValue =DATEDIFF(DAY,DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0),getdate());
BEGIN
  SELECT * FROM SYSSETTING S1
        INNER JOIN 
        SYSSETTINGVALUE OffsetDaysBefore 
               ON(S1.PKey=OffsetDaysBefore.SysSettingPKey)
       INNER JOIN
       EtpSalesOrg ON(EtpSalesOrg.id=OffsetDaysBefore.SalesOrg)
           WHERE 
              S1.Status<>'d' AND OffsetDaysBefore.Status<>'d' AND 
           EtpSalesOrg.status<>'d';
 
UPDATE OffsetDaysBefore SET OffsetDaysBefore.value=@BeforeValue  
        FROM SYSSETTINGVALUE OffsetDaysBefore 
             INNER JOIN  SYSSETTING S1
         ON( S1.PKey=OffsetDaysBefore.SysSettingPKey )
        WHERE  S1.pkey='00100000007p3e4a' and S1.id='TestBefore';
 END;
--------------------------------------------------------
 DECLARE @a INT=(
select DATEDIFF(DAY,DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0),getdate())); 

Create table #temp(id int);
 INSERT INTO #temp values(1),(5),(6);

 select * from #temp;
--
id
--
1
5
6

 UPdate #temp set id=@a where id=5;
  select * from #temp
--
id
--
1
313
6


CHill60

Хорошо сделано для использования правильного метода соединения таблиц и правильного способа обновления на соединении. Однако нет никакой необходимости в начале и конце. SELECT * это плохая практика, перечисление столбцов гораздо надежнее. На самом деле нет никакой необходимости в выборе вообще, но это проблема ОП.

Santosh kumar Pithani

Спасибо Вам Chill60!
Ваше право "выбрать *" - это плохая практика, а также проблема производительности, но это проблема OP.

Member 12965461

У меня действительно есть вопрос.
В запросе запрос update не работает ,так как он не обновляет значение OffsetDaysBefore.value.

Santosh kumar Pithani

Проверить "OffsetDaysBefore.значение" тип данных стоит тип int в противном случае преобразовать его.

Member 12965461

Тогда я также преобразовал тип данных
только оператор select выполняется и дает результат.оператор update не выполняется.

Santosh kumar Pithani

Запрос-это обновления с примером проверки его.