Проблема Update

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Проблема Update

Сообщение Александр Андреев » 15.11.2004 (Пн) 13:31

Всем привет!

Подскажите, если кто сталкивался с подобной проблемой:
В MS SQL Server 2000 делаю Update колонки таблицы (*) значениями из другой таблицы (**). Если таблицу (*) создать динамически с помощью предложения
Код: Выделить всё
SELECT TOP 0 * INTO Tab(*) FROM SomeTab

то некоторые значения из (**) могут быть перепутаны. Такое чувство, что сервер произвольно меняет местами пару значений при апдейте таблицы (*). В результате значение, предназначенное для строки X таблицы (*) меняется местами со значением для строки Y.
Если же таблицу (*) создать вручную, с помощью Design Table, то ничего такого не происходит...
Я в замешательстве :?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 15.11.2004 (Пн) 16:45

Так, ну давай по порядку...

Впервые вижу, чтобы таблицы астерисками именовались. Ты бы хоть X/Y использовал бы, для повышения читабельности. Далее, с каких это пор временные таблицы в сиквеле объявляются без шарпа???
Код: Выделить всё
select top 0 *
INTO #X
from Y

Именно так, и не иначе. Правда, такой способ создания временных таблиц не рекомендуется, но вполне допустим, скажем, в академических целях.
Теперь насчет свопа значений. Будь добр, приведи весь апдейт - оно проще будет...

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 15.11.2004 (Пн) 17:46

Ууффф... а я уж думал, не ответит никто :)
Про шарп - ну не я же заинтродьюсил такие таблицы. Это сделали наши зарубежные коллеги, а мы теперь расхлебываем.
Про (*) и (**) - перехожу к реальным объектам:

Есть таблицы:

Код: Выделить всё
CREATE TABLE [dbo].[MappingModelsTable] (
   [networkID] [tinyint] NOT NULL ,
   [mappingModel] [varchar] (30) ,
   [trxPerCell] [tinyint] NOT NULL ,
   [trxNumber] [tinyint] NOT NULL ,
   [transceiverType] [varchar] (30) ,
   [priority] [tinyint] NULL ,
   [rowID] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[TDMAModelsTable] (
   [networkID] [tinyint] NOT NULL ,
   [tdmaName] [varchar] (30) COLLATE Cyrillic_General_CI_AS NOT NULL ,
   [TS0] [tinyint] NULL ,
   [TS1] [tinyint] NULL ,
   [TS2] [tinyint] NULL ,
   [TS3] [tinyint] NULL ,
   [TS4] [tinyint] NULL ,
   [TS5] [tinyint] NULL ,
   [TS6] [tinyint] NULL ,
   [TS7] [tinyint] NULL ,
   [rowID] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]


и представления:

Код: Выделить всё
Create View dbo.CTFGSM1204MappingModelView
As
Select   
   'networkId'            =      Map.networkId,
   'mappingModel'         =      Map.mappingModel,
   'trxPerCell'         =      Map.trxPerCell,
   'trxNumber'            =      Map.trxNumber,
   'transceiverType'      =      Map.transceiverType,
   'priority'            =      Map.priority
From
   MappingModelsTable   Map


Create View CTFGSM1204TdmaModelView
As
Select
   'networkId'      =      networkId,
   'tdmaName'      =      tdmaName,
   'TS0'         =      TS0,
   'TS1'         =      TS1,
   'TS2'         =      TS2,
   'TS3'         =      TS3,
   'TS4'         =      TS4,
   'TS5'         =      TS5,
   'TS6'         =      TS6,
   'TS7'         =      TS7
From
   TDMAModelsTable



Вот мы создаем наши временные таблички:

Код: Выделить всё
      SELECT TOP 0 * INTO TMPCTFGSM1204TdmaModelView FROM CTFGSM1204TdmaModelView
      SELECT TOP 0 * INTO TMPCTFGSM1204MappingModelView FROM CTFGSM1204MappingModelView


не смущайтесь, что у них суффикс View - это также заслуга наших коллег.

После этого происходит тот самый апдейт:

Код: Выделить всё
UPDATE TMPCTFGSM1204MappingModelView
      SET transceiverType = TRef.tdmaName
   FROM TMPCTFGSM1204MappingModelView AS MTmp
   INNER JOIN TMPCTFGSM1204TDMAModelView AS TTmp
      ON MTmp.transceiverType = TTmp.tdmaName
   INNER JOIN TDMAModelsTable AS TRef
      ON ( TTmp.TS0 = TRef.TS0 OR (TTmp.TS0 IS NULL AND TRef.TS0 IS NULL) )
      AND ( TTmp.TS1 = TRef.TS1 OR (TTmp.TS1 IS NULL AND TRef.TS1 IS NULL) )
      AND ( TTmp.TS2 = TRef.TS2 OR (TTmp.TS2 IS NULL AND TRef.TS2 IS NULL) )
      AND ( TTmp.TS3 = TRef.TS3 OR (TTmp.TS3 IS NULL AND TRef.TS3 IS NULL) )
      AND ( TTmp.TS4 = TRef.TS4 OR (TTmp.TS4 IS NULL AND TRef.TS4 IS NULL) )
      AND ( TTmp.TS5 = TRef.TS5 OR (TTmp.TS5 IS NULL AND TRef.TS5 IS NULL) )
      AND ( TTmp.TS6 = TRef.TS6 OR (TTmp.TS6 IS NULL AND TRef.TS6 IS NULL) )
      AND ( TTmp.TS7 = TRef.TS7 OR (TTmp.TS7 IS NULL AND TRef.TS7 IS NULL) )
      AND TRef.networkId = @networkId


Он переставляет значения transceiverType ... Но если вместо TMPCTFGSM1204MappingModelView использовать статическую таблицу и копировать ее содержимое в TMPCTFGSM1204MappingModelView после апдейта, то никаких перестановок не происходит :?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.11.2004 (Пн) 17:53

Похоже биллинг или система учета коммутационного оборудования.

А почему бы таблички не создавать через CREATE TABLE? Я ведь так понял, что их структура неизменна.
Lasciate ogni speranza, voi ch'entrate.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 15.11.2004 (Пн) 18:00

Почти попал :) Поддержка GSM-сетей.
Ты знаешь, этим буржуям вообще что-то открутить надо давно... При всем их непонятном подходе этот продукт умудряются продавать за суммы, которые просто сносят башню...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.11.2004 (Пн) 18:14

Александр Андреев, знаю :)
Вот тебе выдержка из документации к одной биллинговой программе.
...
Нельзя сразу нажимать на GET, не выбрав диапазон серийных номеров, т.к. это приведет к зависанию системы.
...
Lasciate ogni speranza, voi ch'entrate.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 16.11.2004 (Вт) 14:21

2Ennor:

Ну как, помогло то что я запостил?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.11.2004 (Вт) 16:22

Круто. Что называется, век живи, век учись, дураком подыхай :) . Оказывается, он их в таком SELECT ... INTO создает не как временные, а как постоянные. Не знал, что так тоже можно...

Знаешь, боюсь, лучше тебе обратиться вот сюда: http://www.sql.ru/forum/actualtopics.aspx?bid=1 . Там тебе скорей помогут, но имхо, скорее всего дело в каких-то настройках сиквела. Либо это его глюк...

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 16.11.2004 (Вт) 16:33

Вот у меня тоже идея, что сервак глючит... Тока пойди это докажи кому.
Спасибо за совет.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList