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

Откуда:
Сообщений: 7
SQL SERVER 2008R2

Привет всем!
Есть проблема при update одной таблицы записями из другой
Собственно ошибка заключается в несопостовимости типов данных
а именно в столбцах [Дата ввода], [Дата операции], [Дата рождения], [Дата выдачи паспорта]
Пытался переконвертировать строку в datetime и наоборот(в случае с [Дата операции] )..
использовал:

автор
CONVERT(datetime, [Дата ввода], 121),
CONVERT(datetime, [Дата рождения], 121) ,
CONVERT(datetime, [Дата выдачи паспорта], 121)


И загонял в новую таблицу

Ошибка:
Сообщение 241, уровень 16, состояние 1, строка 25
Ошибка преобразования даты или времени из символьной строки.


На всякий случай выложу структуру:
автор
USE [Statistic]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Второстепенная таблица](
[ID] [int] NULL,
[DMS] [nvarchar](255) NULL,
[Дата документа] [datetime] NULL,
[Фамилия] [nvarchar](255) NULL,
[Имя] [nvarchar](255) NULL,
[Отчество] [nvarchar](255) NULL,
[Тип документа] [nvarchar](255) NULL,
[Серия и номер паспорта] [nvarchar](255) NULL,
[Дата рождения] [nvarchar](255) NULL,
[Дата выдачи паспорта] [nvarchar](255) NULL,
[Дата рождения1] [nvarchar](255) NULL,
[Дата выдачи паспорта1] [nvarchar](255) NULL,
[Время ввода] [datetime] NULL,
[Status] [nvarchar](255) NULL,
[Update user] [nvarchar](255) NULL,
[Дата операции] [datetime] NULL,
[Comments] [nvarchar](255) NULL,
[Check] [nvarchar](255) NULL,
[Папка] [nvarchar](255) NULL,
[Дата ввода] [nvarchar](255) NULL,
[Короб] [nvarchar](255) NULL
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Основная таблица](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Папка] [nvarchar](50) NOT NULL,
[Дата ввода] [datetime] NOT NULL,
[Время ввода] [time](0) NOT NULL,
[Status] [nvarchar](50) NULL,
[Update user] [nvarchar](255) NOT NULL,
[Дата операции] [nvarchar](255) NOT NULL,
[Comments] [nvarchar](255) NOT NULL,
[Тип документа] [nvarchar](100) NULL,
[Серия и номер паспорта] [nvarchar](255) NULL,
[Фамилия] [nvarchar](255) NULL,
[DMS] [nvarchar](255) NULL,
[Дата документа] [date] NULL,
[Имя] [nvarchar](255) NULL,
[Отчество] [nvarchar](255) NULL,
[Дата выдачи паспорта1] [nvarchar](255) NULL,
[Check] [nvarchar](50) NULL,
[Дата рождения1] [nvarchar](255) NULL,
[Дата выдачи паспорта] [date] NULL,
[Дата рождения] [date] NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


Как решить проблему? Заранее спасибо!
6 сен 12, 17:24    [13125695]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
bkhusnutdinov
Пытался переконвертировать строку в datetime и наоборот(в случае с [Дата операции] )..

А зачем, если в обеих таблицах имеет один тип - [Дата операции] [nvarchar](255) NOT NULL ?
6 сен 12, 17:29    [13125721]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
bkhusnutdinov
Member

Откуда:
Сообщений: 7
Не в одной nvarchar(255), а в другой datetime
6 сен 12, 17:31    [13125737]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
bkhusnutdinov
Не в одной nvarchar(255), а в другой datetime
Ну, а что же там, в nvarchar(255) записано-то? Не покажете?
6 сен 12, 17:33    [13125756]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
bkhusnutdinov
Member

Откуда:
Сообщений: 7
2012-04-17 20:23:15.000
6 сен 12, 17:44    [13125865]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
bkhusnutdinov
2012-04-17 20:23:15.000

И вы лично проверили, что во всех записях корректная информация ?
6 сен 12, 17:47    [13125888]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
bkhusnutdinov
Member

Откуда:
Сообщений: 7
Да. Вообще второстепенная таблица она access-овкская....
6 сен 12, 17:53    [13125929]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
bkhusnutdinov
Member

Откуда:
Сообщений: 7
Ладно, я попозже скину скрипт так нагляднее будет....
6 сен 12, 17:55    [13125942]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
SHok_by
Member

Откуда: Minsk
Сообщений: 51
Надо смотреть данные. Явно будет значение которое не соответствует формату DateTime.
6 сен 12, 17:56    [13125952]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
bkhusnutdinov
Ладно, я попозже скину скрипт так нагляднее будет...

Скрин не гарантирует во всех записях значений, которое соответствуют стилю 121
А правильные значения сервер преобразует

select convert(datetime, N'2012-04-17 20:23:15.000', 121)
6 сен 12, 17:58    [13125962]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Вообще-то, 17-го месяца не бывает :))
6 сен 12, 20:11    [13126449]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
Вообще-то, 17-го месяца не бывает :))
Рекомендую REPLACEом заменить пробел в таких строках на букву 'T'.
Хотя бы однозначность появится
6 сен 12, 20:13    [13126457]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
bkhusnutdinov
Member

Откуда:
Сообщений: 7
IF OBJECT_ID('УЛ_УБРБУЛ') IS NOT NULL
DROP TABLE[dbo].[УЛ_УБРБУЛ];
CREATE TABLE УЛ_УБРБУЛ(
    --[ID] [int] NOT NULL,
	--[Папка] [nvarchar](50) NOT NULL,
	[Дата ввода] [datetime] NOT NULL,
	--[Время ввода] [time](0) NOT NULL,
	--[Status] [nvarchar](50) NULL,
	--[Update user] [nvarchar](255) NOT NULL,
	[Дата операции] [nvarchar](255) NOT NULL,
	--[Comments] [nvarchar](255) NOT NULL,
	--[Тип документа] [nvarchar](100) NULL,
	--[Серия и номер паспорта] [nvarchar](255) NULL,
	--[Фамилия] [nvarchar](255) NULL,
	--[DMS] [nvarchar](255) NULL,
	--[Дата документа] [date] NULL,
	--[Имя] [nvarchar](255) NULL,
	--[Отчество] [nvarchar](255) NULL,
	--[Дата выдачи паспорта1] [nvarchar](255) NULL,
	--[Check] [nvarchar](50) NULL,
	--[Дата рождения1] [nvarchar](255) NULL,
	--[Дата выдачи паспорта] [date] NULL,
	--[Дата рождения] [date] NULL,
)
      DECLARE @dt datetime, @do nvarchar(255), @SQLS nvarchar(max)
      DECLARE ul CURSOR FOR
      SELECT [Дата ввода],[Дата операции]
      FROM [dbo].[УЛ_УБРБ_new]
      OPEN ul
      FETCH NEXT FROM ul
      INTO @dt,@do
      WHILE @@FETCH_STATUS = 0
      BEGIN
      SET @SQLS =
       'INSERT INTO [dbo].[УЛ_УБРБУЛ]([Дата ввода],[Дата операции])
       VALUES( 
       CONVERT(datetime, '+@dt+', 121) 
       CONVERT(nvarchar(255), '+@do+'))'
      EXEC (@SQLS)
            FETCH NEXT FROM ul
      INTO @dt, @do;
      END;
      CLOSE ul;
      DEALLOCATE ul;
      GO



Сообщение 241, уровень 16, состояние 1, строка 34
Ошибка преобразования даты или времени из символьной строки.


-____21 или 121 (2)____Канонический формат ODBC (с миллисекундами)____гггг-мм-дд чч:ми:сс.ммм (24-часовой формат)

[Дата ввода] nvarchar(255) пример записи: 2012-04-17 14:09:09.000
7 сен 12, 10:47    [13128206]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
Читатель неместный
Guest
закомментируйте строку
EXEC (@SQLS)
то есть запустите без него
-- EXEC (@SQLS)
7 сен 12, 10:58    [13128297]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
Офигеть просто - курсор да еще с динамическим запросом
А вы вообще смотрели, что за текст запроса вы сформировали в @SQLS ?

ЗЫ
И посмотрите в хелпе синтаксис команды INSERT. Особенно в части, что может являтся источником данных.
7 сен 12, 10:58    [13128300]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация типов данных  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Заметил следующее:
1) где соответствие между выбранными записями из таблицы-источника и вставляемыми записями в таблицу-приёмник? Почему ID не используется?
2) при формировании текста динамического запроса делается попытка конкатенации varchar и datetime - отсюда ошибка;
3) при формировании текста динамического запроса строковое значение необходимо обрамлять кавычками.
'select ... '''+@somevar+''' from ...'
4) запятой в values не хватает.
5) если не ошибаюсь, то convert (с форматированием) результата полезен при преобразовании ИЗ datetime В строку. Зачем его при обратном преобразовании использовать?

Курсор с динамическим запросом - жесть. Операции над наборами данных предпочтительнее.
Если все id в таблице приёмнике есть, то:
update dest
set dest.[дата_операции_datetime] = (
select top 1
cast(src.[дата_операции_varchar] as datetime)
from [dbo].[SourceTable] as src
where src.[id] = dest.[id]
)
from [dbo].[DestinationTable] as dest
7 сен 12, 12:32    [13129025]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить