Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Merge, Windows XP, SQL 2012  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Доброго дня! Такая проблема: есть запрос через инструкцию Merge, который копирует данные из одной таблицы в другую. На Windows 7 все нормально работает, а на ХР вылетает ошибка: Неправильный синтаксис около ключевого слова "Merge"! Выполняю все под админом! База Microsoft SQL Server 2012.
Это в SQL косяк такой что он с ХР не работает? Как унифицировать, т.к. на работе у многих ХР стоит!?
Спасибо за помощь!
5 авг 13, 10:12    [14662253]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
EXEC sp_dbcmptlevel ИмяБазы;
что возвращает?
5 авг 13, 10:16    [14662272]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
EXEC sp_dbcmptlevel ИмяБазы;

что возвращает?
В базе, где ошибка появляется
5 авг 13, 10:16    [14662274]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
SQL Server 2012 не может быть установлен на XP.
5 авг 13, 10:17    [14662281]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
FOGOT-BAstA
т.к. на работе у многих ХР стоит!?


А Вы что, на каждый клиентский комп серверную часть SQL Server планируете инсталлировать?

Покажите результат
SELECT @@version
с сервера, где работает и где не работает.
5 авг 13, 10:25    [14662317]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
И заодно приведите MERGE, который выполняете.
5 авг 13, 10:33    [14662373]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
EXEC sp_dbcmptlevel ИмяБазы;
Возвращает:Текущий уровень совместимости 110.
автор pkarklin
А Вы что, на каждый клиентский комп серверную часть SQL Server планируете инсталлировать?

Нет.
На ХР ничего не ставится. Есть сервер на Windows Server 2008 R2. Клиент сделанный на Delphi лежит в общей локальной папке! Человек с ХР заходит на сервак и запускает приложение.
Вот запрос:
MERGE Nastroyka as target'+
' using (select ID_Kartochka, Tematika, Naimenovanie, ZavNomer, DecNomer from  Kartochka where Kartochka.ID_Kartochka='''+ DBEdit1.Text +''') as source (ID_Kartochka, Tematika ,Naimenovanie, ZavNomer, DecNomer)'+
' on (target.ID_Nastroyka = source.ID_Kartochka) when matched then'+
' update set Tematika = source.Tematika, Naimenovanie = source.Naimenovanie, ZavNomer = source.ZavNomer, DecNomer = source.DecNomer'+
' when not matched then insert (ID_Nastroyka, Tematika, Naimenovanie, ZavNomer, DecNomer, DateNastroyka)'+
' values (source.ID_Kartochka,source.Tematika, source.Naimenovanie, source.ZavNomer, source.Decnomer, GETDATE());');
5 авг 13, 10:52    [14662497]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SQL MERGE syntax works with Win7 SP1 client but fails with earlier platforms
5 авг 13, 11:01    [14662552]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Гость333, это единственный способ, неужели с 2008 ничего не изменилось?=( это вложенный язык он использует? никогда не сталкивался. Можешь подсказать как на делфи запись будет выглядеть?
Спасибо.
5 авг 13, 11:40    [14662833]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
Гость333
Member

Откуда:
Сообщений: 3683
FOGOT-BAstA,

Вот тут ещё один способ нашёлся — поместить какой-нибудь комментарий перед MERGE: How to prevent ADO from altering my SQL command text?
Там же разобрана и причина, по которой возникает синтаксическая ошибка.
5 авг 13, 12:45    [14663326]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
FOGOT-BAstA,

Процедурой оформите:
create procedure dbo.Merge_Nastroyka
 @ID_Kartochka int
as
begin
 set nocount on;

 MERGE Nastroyka as target
  using (select ID_Kartochka, Tematika, Naimenovanie, ZavNomer, DecNomer from  Kartochka where Kartochka.ID_Kartochka=@ID_Kartochka) as source (ID_Kartochka, Tematika ,Naimenovanie, ZavNomer, DecNomer)
 on (target.ID_Nastroyka = source.ID_Kartochka)
 when matched then
  update set Tematika = source.Tematika, Naimenovanie = source.Naimenovanie, ZavNomer = source.ZavNomer, DecNomer = source.DecNomer
 when not matched then
  insert (ID_Nastroyka, Tematika, Naimenovanie, ZavNomer, DecNomer, DateNastroyka)
  values (source.ID_Kartochka,source.Tematika, source.Naimenovanie, source.ZavNomer, source.Decnomer, GETDATE());
end;

Не будет ни проблем с merge, ни проблем с SQL injection.
5 авг 13, 13:08    [14663482]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
invm, сделал так, помогло спасибо!
Гость333, читал, так и не вкурил=))) ну да ладно! спасибо!
6 авг 13, 11:33    [14668253]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
Glory
Member

Откуда:
Сообщений: 104760
FOGOT-BAstA
Гость333, читал, так и не вкурил=)))

Update: A better workaround hack

Rather than wrapping the entire statement in EXEC(...), i found a safer trick to defeating ADO is to precede the statement with a comment. Even an empty comment will do:

--
MERGE Users
USING (VALUES ...

In reality you will want to have some text explaining that the empty comment line is critical to making the query work:

--Leading comment to thwart ADO from mangling MERGE on Windows XP/2003R2
MERGE Users
USING (VALUES ...
6 авг 13, 11:36    [14668269]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
Гость333
Member

Откуда:
Сообщений: 3683
А по поводу того, почему возникает ошибка — ADO дописывает EXEC перед инструкцией MERGE, и на сервер приходит такая инструкция:
exec MERGE Nastroyka as target
  using (select ID_Kartochka, ...

Сам не знал про такие "интересные фокусы", с ADO не доводилось работать :-)
6 авг 13, 11:44    [14668326]     Ответить | Цитировать Сообщить модератору
 Re: Merge, Windows XP, SQL 2012  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Гость333
А по поводу того, почему возникает ошибка — ADO дописывает EXEC перед инструкцией MERGE
Наверное, неправильно используете ADO?

Само там ничего не дописывается, вы, может быть, указали тип вызова как "хранимая процедура".
6 авг 13, 12:29    [14668709]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить