2015-01-06 4 views
0

мне нужна помощь с одной update- вставки со слиянием в SQL Вот оригинал InsertОбъединить таблицы с обновления MS SQL

INSERT INTO [WarehouseMgmt].[JobSteps] 
([JobId],[StepName],[StepNo],[ExecName]) 
VALUES 
(N'HOURLY_JOB', N'SyncReportServerReports', 4210, N'WarehouseMgmt.SyncReportServerReports'), 
(N'MANUAL_JOB', N'SyncReportServerReports', 4210, N'WarehouseMgmt.SyncReportServerReports'), 
(N'HOURLY_JOB', N'SyncReportServerUserEntries', 4220,N'WarehouseMgmt.SyncReportServerUserEntries'), 
(N'MANUAL_JOB', N'SyncReportServerUserEntries', 4220, N'WarehouseMgmt.SyncReportServerUserEntries'), 
(N'HOURLY_JOB', N'SyncReportServerUsers', 4230,N'WarehouseMgmt.SyncReportServerUsers'), 
(N'MANUAL_JOB', N'SyncReportServerUsers', 4230, N'WarehouseMgmt.SyncReportServerUsers'), 
(N'HOURLY_JOB', N'StageFactReportServerExecutionLog', 4240, N'WarehouseStaging.StageFactReportServerExecutionLog'), 
(N'MANUAL_JOB', N'StageFactReportServerExecutionLog', 4240, N'WarehouseStaging.StageFactReportServerExecutionLog'), 
(N'HOURLY_JOB', N'SyncFactReportServerExecutionLog', 4250, N'WarehouseMgmt.SyncFactReportServerExecutionLog'), 
(N'MANUAL_JOB', N'SyncFactReportServerExecutionLog', 4250, N'WarehouseMgmt.SyncFactReportServerExecutionLog') 

INSERT WarehouseMgmt.SyncJobSteps 
(
    JobStepId, 
    StepType, 
    SyncDataSQLId 
) 
SELECT 
    JobStepId = JS.Id, 
    StepType = 'SQL', 
    SyncDataSQLId = SSD.Id 
FROM WarehouseMgmt.JobSteps JS 
JOIN 
(
    VALUES 
     ('SyncReportServerReports', 'WarehouseMgmt.DimReportServerReports'), 
     ('SyncReportServerUserEntries', 'WarehouseMgmt.DimReportServerUserEntries'), 
     ('SyncReportServerUsers', 'WarehouseMgmt.DimReportServerUsers'),  
     ('StageFactReportServerExecutionLog', 'WarehouseStaging.FactReportServerExecutionLog'), 
     ('SyncFactReportServerExecutionLog', 'WarehouseMgmt.FactReportServerExecutionLog') 

) V([SyncJobStep], [SQLDataObjectName]) 
ON JS.StepName=V.[SyncJobStep] 
JOIN WarehouseMgmt.SyncSQLData SSD ON V.[SQLDataObjectName]=SSD.ObjectName 

и я хочу иметь это, я мой стол

INSERT INTO [WarehouseMgmt].[JobSteps] 
([JobId],[StepName],[StepNo],[ExecName]) 
VALUES 
(N'HOURLY_JOB', N'SyncReportServerReports', 4210, N'WarehouseMgmt.SyncReportServerReports'), 
(N'MANUAL_JOB', N'SyncReportServerReports', 4210, N'WarehouseMgmt.SyncReportServerReports'), 
(N'HOURLY_JOB', N'SyncReportServerUserEntries', 4220,N'WarehouseMgmt.SyncReportServerUserEntries'), 
(N'MANUAL_JOB', N'SyncReportServerUserEntries', 4220, N'WarehouseMgmt.SyncReportServerUserEntries'), 
(N'HOURLY_JOB', N'SyncReportServerUsers', 4230,N'WarehouseMgmt.SyncReportServerUsers'), 
(N'MANUAL_JOB', N'SyncReportServerUsers', 4230, N'WarehouseMgmt.SyncReportServerUsers'), 
(N'HOURLY_JOB', N'SyncReportServerFormatEntries', 4240,N'WarehouseMgmt.SyncReportServerFormatEntries'), 
(N'MANUAL_JOB', N'SyncReportServerFormatEntries', 4240, N'WarehouseMgmt.SyncReportServerFormatEntries'), 
(N'HOURLY_JOB', N'SyncReportServerReportFormat', 4250,N'WarehouseMgmt.SyncReportServerReportFormat'), 
(N'MANUAL_JOB', N'SyncReportServerReportFormat', 4250, N'WarehouseMgmt.SyncReportServerReportFormat'), 
(N'HOURLY_JOB', N'StageFactReportServerExecutionLog', 4260, N'WarehouseStaging.StageFactReportServerExecutionLog'), 
(N'MANUAL_JOB', N'StageFactReportServerExecutionLog', 4260, N'WarehouseStaging.StageFactReportServerExecutionLog'), 
(N'HOURLY_JOB', N'SyncFactReportServerExecutionLog', 4270, N'WarehouseMgmt.SyncFactReportServerExecutionLog'), 
(N'MANUAL_JOB', N'SyncFactReportServerExecutionLog', 4270, N'WarehouseMgmt.SyncFactReportServerExecutionLog') 

INSERT WarehouseMgmt.SyncJobSteps 
(
    JobStepId, 
    StepType, 
    SyncDataSQLId 
) 
SELECT 
    JobStepId = JS.Id, 
    StepType = 'SQL', 
    SyncDataSQLId = SSD.Id 
FROM WarehouseMgmt.JobSteps JS 
JOIN 
(
    VALUES 
     ('SyncReportServerReports', 'WarehouseMgmt.DimReportServerReports'), 
     ('SyncReportServerUserEntries', 'WarehouseMgmt.DimReportServerUserEntries'), 
     ('SyncReportServerUsers', 'WarehouseMgmt.DimReportServerUsers'), 
     ('SyncReportServerFormatEntries', 'WarehouseMgmt.DimReportServerFormatEntries'), 
     ('SyncReportServerReportFormat', 'WarehouseMgmt.DimReportServerReportFormat'), 
     ('StageFactReportServerExecutionLog', 'WarehouseStaging.FactReportServerExecutionLog'), 
     ('SyncFactReportServerExecutionLog', 'WarehouseMgmt.FactReportServerExecutionLog') 

) V([SyncJobStep], [SQLDataObjectName]) 
ON JS.StepName=V.[SyncJobStep] 
JOIN WarehouseMgmt.SyncSQLData SSD ON V.[SQLDataObjectName]=SSD.ObjectName 

Я не могу использовать только INSERT, потому что в базе данных уже есть значения, и я не хочу их удалять. Как я могу обновить 4 значения в моей первой Insert и 4 new. Посмотрите внимательно сначала вставить и второй

Я хочу что-то вроде этого

MERGE [WarehouseMgmt].[JobSteps] JS 
USING #JobSteps TJS 
ON(TJS.[StepName] = JS.[StepName]) 
WHEN NOT MATCHED BY TARGET 
THEN INSERT ([JobId],[StepName],[StepNo],[ExecName]) 
VALUES 
(N'HOURLY_JOB', N'SyncReportServerFormatEntries', 4240,N'WarehouseMgmt.SyncReportServerFormatEntries'), 
(N'MANUAL_JOB', N'SyncReportServerFormatEntries', 4240, N'WarehouseMgmt.SyncReportServerFormatEntries'), 
(N'HOURLY_JOB', N'SyncReportServerReportFormat', 4250,N'WarehouseMgmt.SyncReportServerReportFormat'), 
(N'MANUAL_JOB', N'SyncReportServerReportFormat', 4250, N'WarehouseMgmt.SyncReportServerReportFormat') 
WHEN MATCHED 
THEN UPDATE JS.[StepNo] = TJS.[StepNo] ; 

Почему это так?

+0

Создать временную таблицу и вставить те «новые» значения там. Затем вы можете присоединиться к нему, как и любой другой стол, и заполнить вставку. – chris544

+0

Я не могу использовать временную таблицу, мне нужен оператор слияния, который будет обновлять мои строки и вставлять новые строки. – John

+0

Можно создать переменную таблицы с синтаксисом DECLARE. Он исчезнет в следующей партии. Существуют ли действительно конкретные ограничения, допускающие создание такого рода переменных? – chris544

ответ

1

Вы можете использовать таблицу оцененный конструктор в своем заявлении объединения в качестве исходной таблицы почти так же, как вы делаете в избранных, так что вместо:

SELECT Column1, Column2 
FROM (VALUES (1, 2), (3, 4)) AS v (Column1, Column2) 

Вы можете использовать:

MERGE [TableName] AS t 
USING (VALUES (1, 2), (3, 4)) AS v (Column1, Column2) 
    ON t.Column1 = v.Column1 
WHEN MATCHED etc... 

Так что для первого примера вы бы в конечном итоге с:

MERGE [WarehouseMgmt].[JobSteps] AS js 
USING 
( VALUES 
     (N'HOURLY_JOB', N'SyncReportServerReports', 4210, N'WarehouseMgmt.SyncReportServerReports'), 
     (N'MANUAL_JOB', N'SyncReportServerReports', 4210, N'WarehouseMgmt.SyncReportServerReports'), 
     (N'HOURLY_JOB', N'SyncReportServerUserEntries', 4220,N'WarehouseMgmt.SyncReportServerUserEntries'), 
     (N'MANUAL_JOB', N'SyncReportServerUserEntries', 4220, N'WarehouseMgmt.SyncReportServerUserEntries'), 
     (N'HOURLY_JOB', N'SyncReportServerUsers', 4230,N'WarehouseMgmt.SyncReportServerUsers'), 
     (N'MANUAL_JOB', N'SyncReportServerUsers', 4230, N'WarehouseMgmt.SyncReportServerUsers'), 
     (N'HOURLY_JOB', N'SyncReportServerFormatEntries', 4240,N'WarehouseMgmt.SyncReportServerFormatEntries'), 
     (N'MANUAL_JOB', N'SyncReportServerFormatEntries', 4240, N'WarehouseMgmt.SyncReportServerFormatEntries'), 
     (N'HOURLY_JOB', N'SyncReportServerReportFormat', 4250,N'WarehouseMgmt.SyncReportServerReportFormat'), 
     (N'MANUAL_JOB', N'SyncReportServerReportFormat', 4250, N'WarehouseMgmt.SyncReportServerReportFormat'), 
     (N'HOURLY_JOB', N'StageFactReportServerExecutionLog', 4260, N'WarehouseStaging.StageFactReportServerExecutionLog'), 
     (N'MANUAL_JOB', N'StageFactReportServerExecutionLog', 4260, N'WarehouseStaging.StageFactReportServerExecutionLog'), 
     (N'HOURLY_JOB', N'SyncFactReportServerExecutionLog', 4270, N'WarehouseMgmt.SyncFactReportServerExecutionLog'), 
     (N'MANUAL_JOB', N'SyncFactReportServerExecutionLog', 4270, N'WarehouseMgmt.SyncFactReportServerExecutionLog') 
) AS v ([JobId],[StepName],[StepNo],[ExecName]) 
    ON v.JobID = js.JobID 
    AND v.StepName = js.StepName 
WHEN MATCHED THEN 
    UPDATE 
    SET StepNo = v.StepNo, 
     ExecName = v.ExecName 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (JobId, StepName, StepNo, ExecName) 
    VALUES (v.JobId, v.StepName, v.StepNo, v.ExecName); 

Тогда для второго утверждения, я им пакетирования инкапсулировать новые данные с общим выражением таблицы для наглядности, но принцип тот же (хотя я не уверен, что пример того, что столбцы, которые вы хотите, чтобы соответствовать или обновление):

WITH NewSyncJobStep AS 
( SELECT JobStepId = JS.Id, 
      StepType = 'SQL', 
      SyncDataSQLId = SSD.Id 
    FROM WarehouseMgmt.JobSteps JS 
      JOIN 
      (
       VALUES 
        ('SyncReportServerReports', 'WarehouseMgmt.DimReportServerReports'), 
        ('SyncReportServerUserEntries', 'WarehouseMgmt.DimReportServerUserEntries'), 
        ('SyncReportServerUsers', 'WarehouseMgmt.DimReportServerUsers'), 
        ('SyncReportServerFormatEntries', 'WarehouseMgmt.DimReportServerFormatEntries'), 
        ('SyncReportServerReportFormat', 'WarehouseMgmt.DimReportServerReportFormat'), 
        ('StageFactReportServerExecutionLog', 'WarehouseStaging.FactReportServerExecutionLog'), 
        ('SyncFactReportServerExecutionLog', 'WarehouseMgmt.FactReportServerExecutionLog') 

      ) V([SyncJobStep], [SQLDataObjectName]) 
       ON JS.StepName=V.[SyncJobStep] 
      JOIN WarehouseMgmt.SyncSQLData SSD 
       ON V.[SQLDataObjectName]=SSD.ObjectName 
) 
MERGE WarehouseMgmt.SyncJobSteps AS sjs 
USING NewSyncJobStep AS n 
    ON n.JobStepId = sjs.JobStepId 
WHEN MATCHED THEN 
    UPDATE SET SyncDataSQLId = n.SyncDataSQLId 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (JobStepId, StepType, SyncDataSQLId) 
    VALUES (n.JobStepId, n.StepType, n.SyncDataSQLId); 
Смежные вопросы