Динамический запрос для выборки записей

#sql #sql-server #sql-server-2008

#sql #sql-сервер #sql-server-2008

Вопрос:

У меня такой сценарий

Вставка базы данных 1 в таблицу :

 ID    Person    
1     John
 

Перед вставкой записи я должен убедиться, что этот человек уже существует, который обрабатывается в другой БД

База данных 2;

 Person   Ou
JOhn     1
Shyam    2
 

База данных 3:

 Person   Ou 
Ram      5
 

….

Как только запись существует, я должен вставить ту же запись в эту базу данных. Если ничего не существует, всплывает ошибка, введенная пользователем, недействительна.

Я пробовал этот код

  Select *,
        row_number() over(order by name)  'R'
        into #temp
from    sys.databases 
where   database_id not in (1,2,3,4,db_id(db_name()))

Declare @int i =1 
declare @person varchar(100) = person from inserting (nolock)
declare @dbname varchar(max)
Declare @sql nvarchar(max) 
while (@i <= (Select max(R) from #temp))
begin 
Set @dbname = (Select name from #temp where R = @i)

Set @Sql = 'if exists (Select 1 from '''  @dbname '''..person where person =  '''@person''' )'
execute sp_executesql @sql
Set @i = (Select max(R) from #temp)) 2
else
set @i = @i 1
end

if @i> (select MAX(R) 1 from #temp)
begin
SET @sql = 'insert into '''  @dbname '''..person Select ID,person from person'
execute sp_executesql @sql
end
else
raiserror('No record esxists.',16,1)
 

Но все же я не могу вставить запись, даже если запись существует. Любой может улучшить этот запрос или любые предложения приветствуются.

Ответ №1:

Вы можете использовать синонимы в своей базе данных, чтобы использовать таблицу person из базы данных 2 и базы данных 3.

 CREATE SYNONYM [dbo].[Person2] FOR [Server2].[Database2].[dbo].[Person]
CREATE SYNONYM [dbo].[Person3] FOR [Server3].[Database3].[dbo].[Person]
 

После создания ваших синонимов из таблицы Person в database2 и database3, Person2 и Person3 ведут себя как таблица Person в Database1, и вы можете вставлять, обновлять и удалять строки из них без каких-либо проблем.

Комментарии:

1. Существует не только две базы данных . Если я знаю базы данных, я согласен с этим. Я могу просто использовать синонимы, но я не уверен, сколько существует БД, а также, если клиент запрашивает создание новой БД, и мой запрос должен ее обработать, поэтому я использовал sys.databases, исключающий систему и текущую БД.