Member 10914736 Ответов: 2

Количество таблиц равно количеству заданий?


Hi there,

We have a database which consists of 12 tables. I want to create a SQL Job to copy the table data from one database to another (same server) hourly in a set schedule time. Data will be updated every hour at source database and that fresh data should be copied to my destination database time to time. So, in my Job step, I wrote a below query,

delete from <destination_table>
go
insert into <destination_table>
select * from [SourceDatabase].dbo.<Source_table>
go

And this query is working fine for 1 job and 1 table.

If I want to pass all 12 tables in the same job rather than creating 12 jobs for 12 tables, which query helps so that copying fresh data should be done by a single query for all 12 tables?

or shall we create 12 steps for 12 tables in that job? 

Please suggest.

Thanks,


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

Удалить из & lt;destination_table>
идти
вставить в & lt;destination_table>
выберите * из [SourceDatabase]. dbo. & lt;source_table>
идти

ПРИВЕДЕННЫЙ ВЫШЕ ЗАПРОС К 1 ТАБЛИЦЕ

Maciej Los

Зачем вам нужна эта функциональность? Это звучит очень иррационально.

2 Ответов

Рейтинг:
5

Birsh Pal

Из вопроса я предполагаю
#1 - ваше задание SQL будет выполняться в исходной базе данных
#2-имена исходной и целевой таблиц могут совпадать, а могут и не совпадать.

Есть два решения вашей проблемы.

Во-первых, если #2 не так, это означает, что структура таблиц и ограничения одинаковы в исходных и целевых таблицах, вы можете использовать функцию репликации SQL базы данных.

Во-вторых, если оба вышеперечисленных пункта верны, вы можете создать задание SQL в исходной базе данных, как и планировалось.Ниже упоминается сценарий, который использует динамический запрос,чтобы он был помещен в команду шага задания.
Примечание: В этом случае вам необходимо отредактировать имя целевой базы данных. Кроме того, вы должны вставить имена источника и назначения в табличную переменную @SourceDestinattionTables. Образец данных вставлен, вы можете добавить/удалить его в соответствии с вашими потребностями.

НАЧАТЬ ТРАНЗАКЦИЮ
Объявить @DestinationDatabaseName VARCHAR(50)
DECLARE @SourceDestinattionTables TABLE ( TableMappingID INT Identity(1,1), SourceTable VARCHAR(500), DestinationTable VARCHAR(500))
--------------- Ввод - - - - - - - - - установить имя целевой базы данных ---------------
SET @DestinationDatabaseName = 'DestDB'

--------------- Ввод - - - - - - установка имен исходных и целевых таблиц ---------------
Вставить в @ SourceDestinattionTables
Значения ('SourceEmployees', 'DestEmployees'),
('SourceOrders', 'DestOrders')

Объявить @DestinationTable VARCHAR(100)
Объявить @SourceTable VARCHAR(100)
Объявить @TableCount INT
Объявить @index INT
Объявить @InsertScript NVARCHAR(MAX)


Выберите @TableCount = COUNT(1)
ОТ
@SourceDestinattionTables

SET @index = 1
WHILE (@index <=@TableCount)
НАЧАТЬ

ВЫБИРАТЬ
@Destinationtable Не = Destinationtable Не,
@SourceTable = SourceTable
ОТ
@SourceDestinattionTables
ГДЕ
TableMappingID = @index

SET @InsertScript ="
Выберите @InsertScript = 'удалить' +@DestinationDatabaseName+'.ДБО.'+@Destinationtable не + ' '
Выберите @InsertScript = @InsertScript + 'вставить в' +@DestinationDatabaseName+'.ДБО.'+@Destinationtable не+ 'выбрать * из' +@SourceTable

Выберите @index = @index + 1

Выполнить sp_executesql @InsertScript

КОНЕЦ
СОВЕРШИТЬ


Member 10914736

Спасибо.

Рейтинг:
19

FranzBe

1) Вы можете написать хранимую процедуру, которая обрабатывает 12 таблиц одну за другой, вы можете вызвать эту хранимую процедуру из вашей работы; возможно, вы хотите использовать транзакцию вокруг delete и insert

CREATE PROCEDURE [dbo].[psp_sync_stuff]
AS
  DECLARE @iCnt INT
  SET NOCOUNT ON
-- start of job
-- first table
SELECT *
 INTO #tempTableName
 FROM  [ServerName].DbName.dbo.sourceTableName 


SELECT @iCnt = COUNT(0) FROM  #tempTableName
IF @iCnt > 0
  BEGIN
    BEGIN TRANSACTION
      DELETE FROM   targetTableName
      INSERT INTO   targetTableName
      SELECT * FROM #tempTableName
    COMMIT TRANSACTION
END

-- second tables goeshere
-- [...]

SET NOCOUNT OFF
GO



2) Когда вы хотите поместить свои имена таблиц в переменные, вам понадобится sp_executesql для выполнения результирующего динамического sql, что-то в этом направлении

DECLARE @vSql        NVARCHAR(4000)
DECLARE @vSourceTableName1 NVARCHAR(100)
SET @vSourceTableName1 = "[ServerName].DbName.dbo.sourceTableName"
SET @vSql = "SELECT * INTO #tempTableName FROM " + @vSourceTableName1
EXECUTE sp_executesql @vSql


3) Возможно, вам стоит прочитать что-нибудь о репликации и посмотреть, может ли она выполнять ту работу, которую вы хотите выполнить (вы не упоминаете свою серверную систему баз данных, MS SQL Server или Oracle, или ?)


Member 10914736

Спасибо.
работает на меня.