2013-03-06 4 views
0

У меня есть база данных с возможностью использования. Я хочу обновить всех пользователей csv-файлом. Я импортировал свой файл csv во временную таблицу с SqlBulkCopy.Слияние таблиц с сервером sql 2008

Следующим шагом будет создание хранимой процедуры, которая обновляет таблицу моих пользователей, используя временную таблицу. До сих пор у меня есть это:

USE [Userdata] 
GO 
/****** Object: StoredProcedure [dbo].[aml_UserImport] Script Date: 03/06/2013 14:11:44 ******/ 
SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 
-- ============================================= 
-- Author:  michiel reyers 
-- Create date: 07-01-2013 
-- Description: 
-- ============================================= 
CREATE PROCEDURE [dbo].[aml_UserImport2] 

AS 

    SET NOCOUNT ON; 

    MERGE users 
     USING temp_users ON temp_users.ID = users.ID 
     WHEN MATCHED 
      THEN UPDATE SET users.typeId = temp_users.typeId, 
           users.Name = temp_users.Name, 
           users.active = 1 
     WHEN NOT MATCHED BY SOURCE 
      THEN UPDATE SET users.active = 0 
     WHEN NOT MATCHED BY TARGET 
      THEN Insert (ID,typeID,Name,active) 
      VALUES (temp_users.ID,temp_users.typeId,temp_users.Name,1) 
    ; 

Когда я пытаюсь выполнить это я получаю сообщение об ошибке:

Msg 102, Level 15, State 1, Procedure aml_UserImport2, Line 13 Incorrect syntax near 'MERGE'.

Что я делаю не так?

Я добавил semicolumn, но до сих пор не повезло :-(

UPDATE:.

Я сделал перепроверки и Altough Я использую MS SQL Management Server 2008 R2 кажется, что моя база данных имеет уровень совместимости SQL Server 2005 (90) это, вероятно, объясняет, почему это не работает ....

Спасибо всем

+0

Гарет, нет гораздо больше, но я добавил весь код ... – Michiel

+1

Я нахожусь в убытке на этом, поскольку процедура выполняется без ошибок на моей локальной машине (2008 и 2012), а также в [SQL Fiddle] (http: //sqlfiddle.com/#!3/ce030). – GarethD

+1

Gareth благодарит вас за проверку кода. Я сделал перепроверку, и, хотя я использую MS SQL Server Management 2008 R2. Кажется, что моя база данных имеет уровень совместимости SQL Server 2005 (90). Вероятно, это объясняет, почему это не работает .... – Michiel

ответ

1

Помещенный;.!. после слияния

Оператор MERGE требует точки с запятой (;) в качестве терминатора оператора. Ошибка 10713 возникает, когда MERGE оператор выполняется без терминатора (из MSDN)

+0

моему слиянию предшествует инструкция: \t SET NOCOUNT ON; что полуколонка должна делать это правильно? – Michiel

+0

да .. это должно было –

+0

, но я собирался сказать после ..: D как в маленьком тексте из MSDN .. –

1

Мои предложения являются:.

  1. точку с запятой в конце выражения слияния
  2. Пожалуйста, проверьте, если ACTIVE поле = определено как INT. в случае TINYINT пожалуйста бросить 1 explicetly
+0

active немного, когда я его удаляю, я получаю ту же ошибку ... – Michiel

0

В Merge заявление с сервером SQL вы должны закончить его с ; Semi-ободочной кишки

Check Syntax here MSDN

MERGE users 
    USING temp_users ON temp_users.ID = users.ID 
    WHEN MATCHED 
     THEN UPDATE SET users.typeId = temp_users.typeId, 
         users.Name = temp_users.Name, 
         users.active = 1 
    WHEN NOT MATCHED BY SOURCE 
     THEN UPDATE SET users.active = 0 
    WHEN NOT MATCHED BY TARGET 
     THEN Insert (ID,typeID,Name,active) 
      VALUES (temp_users.ID,temp_users.typeId,temp_users.Name,1); 
Смежные вопросы