Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с запросом в MS SQL Server 2005  [new]
jesse.pinkman
Member

Откуда:
Сообщений: 3
Помогите, пожалуйста, у меня проблема.
Работаю в MSSQL Server 2005.
Есть 2 таблицы - в одной пики точены в одной пациенты (PATIENTS), в другой - их визиты (DATA).
И в той, и в другой таблице есть поле PATIENTS_ID, по которому они связаны отношением один-ко-многим (ну то есть одной записи о пациенте в таблице PATIENTS могут соответствовать несколько записей с тем же PATIENTS_ID в DATA).
Также в обоих таблицах есть поля REKLAMA(int) и FAMILIYA_VRACHA(varchar(99)), в PATIENTS в этих полях есть данные, а в DATA нет.
Приведу пример, чтоб понятней было

PATIENTS:

PATIENTS_ID REKLAMA FAMILIYA_VRACHA ...
1 2 Петров ...
2 4 Иванов ...


DATA:

PATIENTS_ID DATE_CONSULTATION REKLAMA FAMILIYA_VRACHA ...
1 23.12.2010 17:26:56 NULL NULL ...
1 11.05.2011 10:38:15 NULL NULL ...
2 12.06.2011 10:22:13 NULL NULL ...
2 13.06.2011 12:35:15 NULL NULL ...
3 12.05.2011 20:18:56 NULL NULL ...


Мне нужно перенести данные из таблицы PATIENTS (REKLAMA и FAMILIYA_VRACHA) в таблицу DATA (в те же поля).
Типа чтоб было вот так:

DATA:

PATIENTS_ID DATE_CONSULTATION REKLAMA FAMILIYA_VRACHA ...
1 23.12.2010 17:26:56 2 Петров ...
1 11.05.2011 10:38:15 NULL NULL ...
2 12.06.2011 10:22:13 4 Иванов ...
2 13.06.2011 12:35:15 NULL NULL ...
3 12.05.2011 20:18:56 NULL NULL ...


Вообще нужно сделать, чтобы данные из PATIENTS переносились в самую раннюю запись (где минимальная DATE_CONSULTATION), но тащемта пофиг, главное, чтоб хоть как-то перенеслись.
Для этого я пишу такой запрос:
UPDATE 
	dbo.DATA_MOTCONSU_BILLDET
SET 
	REKLAMA = P.REKLAMA,
	FAMILIYA_VRACHA = P.FAMILIYA_VRACHA
FROM 
	(dbo.DATA_MOTCONSU_BILLDET D
INNER JOIN 
	dbo.PATIENTS P
ON D.PATIENTS_ID = P.PATIENTS_ID
)

Мне SQL Server выдает такое:

Преобразование типа данных char в тип данных datetime привело к значению datetime за пределами диапазона.
Выполнение данной инструкции было прервано.

В чем тут дело? Я искал все что можно насчет этой ошибки, прочитал, что там с датами может быть проблема, в таблицах есть поля с датами, но в запросе я их никак не использую!!!!!
В чем дело тогда???
25 июл 15, 23:29    [17934542]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом в MS SQL Server 2005  [new]
jesse.pinkman
Member

Откуда:
Сообщений: 3
Запрос такой, точнее:
UPDATE 
	dbo.DATA
SET 
	REKLAMA = P.REKLAMA,
	FAMILIYA_VRACHA = P.FAMILIYA_VRACHA
FROM 
	(dbo.DATA D
INNER JOIN 
	dbo.PATIENTS P
ON D.PATIENTS_ID = P.PATIENTS_ID
)

Просто упростил названия таблиц в посте без потери для смысла, а поменять текст запроса забыл)
25 июл 15, 23:32    [17934555]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом в MS SQL Server 2005  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
а вы уверены, что работаете именно с таблицами, а не представлениями (view)?
или что на таблицах нет триггеров, которые что-то там считают, используя неявное преобразование строк в дату?
26 июл 15, 22:21    [17936535]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом в MS SQL Server 2005  [new]
jesse.pinkman
Member

Откуда:
Сообщений: 3
Oleksii Kovalov, я новичок, к сожалению, не знаю даже, что такое представления и триггеры) но вроде бы это просто таблицы.
Триггеры есть, аж целых 3. По-видимому, вот этот на update
USE [MyBase]
GO
/****** Объект:  Trigger [dbo].[tU_DATA_MOTCONSU_BILLDET]    Дата сценария: 07/26/2015 22:52:34 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER trigger [dbo].[tU_DATA_MOTCONSU_BILLDET] on [dbo].[DATA_MOTCONSU_BILLDET] for UPDATE as
begin
declare  @ERRNO   int,
         @ERRMSG  varchar(255)
if @@ROWCOUNT = 0 return
if not update(KRN_MODIFY_DATE) or not update(KRN_MODIFY_USER_ID)
begin
  Declare @USER_ID int
  select @USER_ID = USER_ID from KRN_SYS_SESSIONS
  where SESSION_ID = @@SPID
  update DATA_MOTCONSU_BILLDET  set KRN_MODIFY_DATE = convert(varchar(30),GetDate(),20), KRN_MODIFY_USER_ID = @USER_ID
  from DATA_MOTCONSU_BILLDET, inserted i
  where DATA_MOTCONSU_BILLDET.DATA_MOTCONSU_BILLDET_ID = i.DATA_MOTCONSU_BILLDET_ID
end
return
error:
  raiserror @ERRNO @ERRMSG
  rollback transaction
end

Я так понял, именно он что-то делает с датой. А что дальше с ним делать?
26 июл 15, 22:57    [17936693]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом в MS SQL Server 2005  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
Не похоже на этот триггер, тут дату пихают в строку, а нужно где строку пихают в дату
смотрите еще
26 июл 15, 23:26    [17936805]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом в MS SQL Server 2005  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
jesse.pinkman
А что дальше с ним делать?
Заменить
convert(varchar(30),GetDate(),20)
на
getdate()

И выполнить этот скрипт.

jesse.pinkman
Вообще нужно сделать, чтобы данные из PATIENTS переносились в самую раннюю запись (где минимальная DATE_CONSULTATION)
with t as
(
 select
  PATIENTS_ID,
  row_number() over partition by (partition by PATIENTS_ID order by DATE_CONSULTATION) as rn,
  REKLAMA,
  FAMILIYA_VRACHA
 from
  DATA
)
update t
 set
  FAMILIYA_VRACHA = p.FAMILIYA_VRACHA,
  REKLAMA = p.REKLAMA
from
 t join
 PATIENTS p on p.PATIENTS_ID = t.PATIENTS_ID
where
 t.rn = 1;
26 июл 15, 23:32    [17936839]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить