T-SQL динамический подзапрос
возникла такая проблема, есть запрос, в котором таблицу нужно постоянно менять, хотелось бы её вынести в переменную, в виде отдельного запроса всё ок, но как это можно впихнуть в другой запрос? Вот что 'напытался'
--ОК РАБОТАЕТ
declare @table_name varchar(20) = 'rfiles_01022020'
declare @sql varchar(max)
select @sql = 'select r.id from rfiles.dbo.' + @table_name + ' as r '
exec(@sql)
--ЭТО ТО ЧТО НУЖНО БЕЗ ДИНАМИЧЕСКОГО ЗАПРОСА
select * from MO_BUFFER as m
where exists(select r.id from [rfiles].[dbo].[rfiles_01022020] as r )
--ЭТО УЖЕ НЕ РАБОТАЕТ (
declare @table_name varchar(20) = 'rfiles_01022020'
declare @sql varchar(max)
select @sql = 'select r.id from rfiles.dbo.' + @table_name + ' as r '
select * from MO_BUFFER as m
where exists(exec(@sql))
PS это для внутренних операций, если вы вдруг хотели мне поведать о опасности SQL инъекций
PPS весь запрос в строку взять не могу, т.к. здесь приведена лишь малая часть его, а так он огромный, с кучей кавычек
---НАЧАЛО ЗАПРОСА
update mo_buffer
set
RINTECHERR=case when isnull(RINTECHERR,'')='' then 'РК4' else RINTECHERR+',РК4' end,
[status] = 2
from MO_BUFFER as m
inner join people as p on p.id = m.people
where m.mo_log = @mo_log
and
(case
when exists (select r.id from [rfiles].[dbo].[rfiles_01022020] as r where r.id = m.people )
then
Ответы (3 шт):
Автор решения: Denis Rubashkin
→ Ссылка
У вас подзапрос никак не связан с остальной выборкой - выполняйте его отдельно:
DECLARE @SQL NVARCHAR(MAX)
, @isExist bit = 0
, @TableName NVARCHAR(500) = N'[rfiles].[dbo].[rfiles_01022020]'
SELECT @SQL =
N'IF EXISTS(
select r.id
from ' + @TableName + ' as r
)
SELECT @isExist = 1;'
EXEC sp_executesql @SQL, N'@isExist bit OUTPUT', @isExist OUTPUT
select * from MO_BUFFER as m
where @isExist = 1
Автор решения: koshe
→ Ссылка
Можно использовать временную таблицу:
declare @table_name varchar(20) = 'rfiles_01022020'
declare @sql varchar(max)
if object_id('tempdb..#tmp_table') is not null
drop table #tmp_table;
create table #tmp_table (id int);
select @sql = 'insert into #tmp_table select r.id from rfiles.dbo.' + @table_name + ' as r '
exec(@sql)
select * from MO_BUFFER as m
where exists(select * from #tmp_table)
Автор решения: Ferdipux
→ Ссылка
Создайте синоним
Create Synonym rfiles for [rfiles].[dbo].[rfiles_01022020]
И используйте его в вашем запросе
select * from MO_BUFFER as m
where exists(select r.id from [rfiles] as r )
Понятно, что после выполнения запроса - синонимы нужно удалить.