Оператор SELECT, который присваивает значение переменной, не должен сочетаться с операциями поиска данных
Что не так с этим утверждением?
ALTER Function [InvestmentReturn].[getSecurityMinLowForPeriod](@securityid int,
@start datetime,
@end datetime)
returns xml
begin
declare @results varchar(500)
declare @low int
declare @adjustedLow int
declare @day varchar(10)
if @end is null
begin
set @end = getdate()
end
set @adjustedLow = (select min(adjLow)
from (
select Low * [InvestmentReturn].[fn_getCorporateActionSplitFactor](isq.securityid, @start, convert(varchar,day, 111)) as adjLow
from
securityquote isq
where isq.securityid = @securityid and isq.day >= convert(varchar(10), @start, 111) and convert(varchar(10), @end, 111) >= isq.day
and low != -1
) as x)
select
top 1 @low = low
, @day = day
, @adjustedLow
--select high
from
securityquote sq
where
day >= convert(varchar(10), @start, 111) and convert(varchar(10), @end, 111) >= day
and securityid = @securityid and low != -1
order by low asc
set @results= '<results type="debug_min">'
set @results = @results + '<periodStart>' + coalesce(cast(@start as varchar(20)), 'NULL') + '</periodStart>'
set @results = @results + '<periodEnd>' + coalesce(cast(@end as varchar(20)), 'NULL') + '</periodEnd>'
set @results = @results + '<securityID>' + coalesce(cast(@securityID as varchar(10)), 'NULL') + '</securityID>'
set @results = @results + '<periodMin>' + coalesce(cast(@low as varchar(10)), '-11111') + '</periodMin>'
set @results = @results + '<coraxAdjustedPeriodMin>' + coalesce(cast(@adjustedLow as varchar(10)), '-11111') + '</coraxAdjustedPeriodMin>'
set @results = @results + '<dayMinOcurred>' + coalesce(@day, 'NULL') + '</dayMinOcurred>'
set @results = @results + '</results>'
return @results
Просто, чтобы объяснить ответ (после получения ошибки, вызванной ошибкой), я просто удалил @adjustedLow из второго оператора select.
Ответы
Ответ 1
Значения столбцов из оператора SELECT присваиваются локальным переменным @low
и @day
; значение @adjustedLow
не назначается ни в какую переменную, и это вызывает проблему:
Проблема здесь:
select
top 1 @low = low
, @day = day
, @adjustedLow -- causes error!
--select high
from
securityquote sq
...
Подробное объяснение и обход: Сообщения об ошибках SQL Server - Msg 141 - Оператор SELECT, который присваивает значение переменной, не должен сочетаться с операциями поиска данных.
Ответ 2
Вы не можете использовать оператор select, который присваивает значения переменным, чтобы также возвращать данные пользователю
Следующий код будет работать нормально, потому что я объявил 1 локальную переменную, и эта переменная используется в select statement.
Begin
DECLARE @name nvarchar(max)
select @name=PolicyHolderName from Table
select @name
END
В приведенном ниже коде будет выведена ошибка "Оператор SELECT, который присваивает значение переменной
не должны сочетаться с операциями извлечения данных "Поскольку мы извлекаем данные (PolicyHolderAddress) из таблицы, но ошибка говорит о том, что операция поиска данных не допускается, когда вы используете некоторую локальную переменную как часть оператора select.
Begin
DECLARE @name nvarchar(max)
select
@name = PolicyHolderName,
PolicyHolderAddress
from Table
END
Вышеуказанный код можно скорректировать, как показано ниже,
Begin
DECLARE @name nvarchar(max)
DECLARE @address varchar(100)
select
@name = PolicyHolderName,
@address = PolicyHolderAddress
from Table
END
Таким образом, либо удалите операцию поиска данных, либо добавьте дополнительную локальную переменную. Это устранит ошибку.
Ответ 3
У меня та же проблема при переносе кода с MySQL на SQL Server. Я возвращаю данные из таблиц, а также делаю некоторые сложные вычисления, для которых я назначил некоторые предварительные значения локальным переменным, на которые нужно ссылаться в последующих строках.
Я собираюсь реструктурировать это как несколько вложенных подзапросов, передавая вычисления вверх по строке?
SELECT
r.job_id,
r.airport_id,
r.runway_id,
r.status_cd,
r.point_id,
ob.easting,
ob.northing,
rw.bearingtrue,
@azim_n=DEGREES(ATN2((rw.end_1_east-ob.easting),(rw.end_1_north-ob.northing)))+180 AS azim_n,
@azim_rw=IIF(@azim_n-rw.bearingtrue > 180,@azim_n-rw.bearingtrue-360,
IIF(@azim_n-rw.bearingtrue < -180,[email protected]_n-rw.bearingtrue,
@azim_n-rw.bearingtrue)) AS azim_rw,
@dist_1=SQRT(POWER((ob.easting-rw.end_1_east),2)+POWER((ob.northing-rw.end_1_north),2)) AS FromRwyEnd_1,
@dist_2=SQRT(POWER((ob.easting-rw.end_2_east),2)+POWER((ob.northing-rw.end_2_north),2)) AS FromRwyEnd_2,
IIF(@azim_rw < 0,'L','R') AS Runway_Side,
ABS(@dist_1*SIN(RADIANS(@azim_rw))) AS FromCen,
-1*@dist_1*COS(RADIANS(@azim_rw)) AS FromEnd_1,
IIF(ABS(@dist_1)<ABS(@dist_2),
SUBSTR(rw.runway_id,1,INSTR(rw.runway_id,'-')-1),
SUBSTR(rw.runway_id, INSTR(rw.runway_id,'-')+1)) AS Nearest_End
FROM aaa.currentjob AS j
INNER JOIN aaa.airport_config AS ac...
Ответ 4
declare @cur cursor
declare @idx int
declare @Approval_No varchar(50)
declare @ReqNo varchar(100)
declare @M_Id varchar(100)
declare @Mail_ID varchar(100)
declare @temp table
(
val varchar(100)
)
declare @temp2 table
(
appno varchar(100),
mailid varchar(100),
userod varchar(100)
)
declare @slice varchar(8000)
declare @String varchar(100)
--set @String = '1200096,1200095,1200094,1200093,1200092,1200092'
set @String = '20131'
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(',',@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
--select @slice
insert into @temp values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
-- select distinct(val) from @temp
SET @cur = CURSOR FOR select distinct(val) from @temp
--open cursor
OPEN @cur
--fetchng id into variable
FETCH NEXT
FROM @cur into @Approval_No
--
--loop still the end
while @@FETCH_STATUS = 0
BEGIN
select distinct(Approval_Sr_No) as asd, @ReqNo=Approval_Sr_No,@M_Id=AM_ID,@Mail_ID=Mail_ID from WFMS_PRAO,WFMS_USERMASTER where WFMS_PRAO.AM_ID=WFMS_USERMASTER.User_ID
and [email protected]_No
insert into @temp2 values(@ReqNo,@M_Id,@Mail_ID)
FETCH NEXT
FROM @cur into @Approval_No
end
--close cursor
CLOSE @cur
select * from @tem