Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 SqlServer Agent - ошибка обработки даты  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Добрый день!
Проблема с джобом на Sql Server 2008, он содержит единственный шаг, где вызывается такая хранимка:

ALTER PROCEDURE [dbo].[CreateAvanceAccounts]
AS BEGIN

	INSERT INTO ASR.dbo.Paymentaccounting#virtualaccount
		(accountid, contractpackageid,accountvalue,currencyid,accounttypeid)
	SELECT contractpackageid*2 as accountid, contractpackageid, 0 as accountvalue, 1 as currencyid, 1 as accounttypeid
	FROM asr.dbo.Contract#Contract
	WHERE contractpackageid not in
		(SELECT ContractpackageID from asr.dbo.PaymentAccounting#VirtualAccount
		WHERE accounttypeid = 1
		GROUP BY ContractPackageID)
		and contractid in
		(SELECT contractid from asr.dbo.TelephoneContractMapping
		WHERE billingcontractid in
			(SELECT contractid FROM billing.dbo.conclusion)
		)


	INSERT INTO asr.dbo.paymentaccounting#virtualaccount
		(accountid, contractpackageid,accountvalue,currencyid,accounttypeid)
	SELECT contractpackageid*2+1 as accountid, contractpackageid, 0 as accountvalue, 1 as currencyid, 351 as accounttypeid
	FROM asr.dbo.Contract#Contract
	WHERE contractpackageid not in
		(select ContractpackageID from asr.dbo.PaymentAccounting#VirtualAccount
		where accounttypeid = 351
		group by ContractPackageID)
		and contractid in
		(select contractid from asr.dbo.TelephoneContractMapping
		where billingcontractid in
			(select contractid from billing.dbo.conclusion)
		)

END


(все эти in и not in - жуткая кривота, не пинайте, не мой код. Оно уже так было, мне сейчас надо тупо запустить)

Валится с ошибкой, в журнале джоба сообщение:

Выполняется от имени пользователя: MyDomain\sql01agent (виндовая аутентификация). Ошибка преобразования даты или времени из символьной строки. [SQLSTATE 22007] (Ошибка 241). Шаг завершился с ошибкой.

Прикол в том, что в sql-коде нигде нет работы с датой. Шаг джоба выглядит так: exec dbo.CreateAvanceAccounts, и все.
Куда копать?
На другом сервере тот же джоб работает. На этом сервере (там, где валится) хранимка отдельно (без джоба) отрабатывает нормально, но под моей учеткой. Зайти под MyDomain\sql01agent не получается, удаленный вход отключен...
21 май 14, 11:50    [16047182]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Я вообще туда рою? Проблема в языковых настройках пользователя sql01agent? Или не туда?
21 май 14, 11:50    [16047198]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
В журнале нажмите на крестик, перейдите на ветку и посмотрите подробности ошибки.
21 май 14, 12:04    [16047377]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Дата 21.05.2014 9:56:46
Журнал Журнал заданий (Создание авансово-накопительных счетов для новых договоров)

Идентификатор шага 1
Сервер SQL03
Имя задания Создание авансово-накопительных счетов для новых договоров
Имя шага Создание авансово-накопительных счетов
Продолжительность 00:00:00
Серьезность Sql 16
Идентификатор Sql-сообщения 241
Оператору отправлено сообщение электронной почты
Оператору отправлено сообщение командой Net send
Оператору отправлено сообщение на пейджер
Предпринято повторов 0

Сообщение
Выполняется от имени пользователя: INFOLINE\sql01agent.Ошибка преобразования даты или времени из символьной строки. [SQLSTATE 22007] (Ошибка 241). Шаг завершился с ошибкой.
21 май 14, 12:13    [16047489]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
pima,

может, у таблицы есть триггеры?
21 май 14, 12:17    [16047529]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Триггер в таблице ASR.dbo.Paymentaccounting#virtualaccount?
21 май 14, 12:21    [16047549]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Владислав Колосов
Триггер в таблице ASR.dbo.Paymentaccounting#virtualaccount?
А что, вставка ведётся в несколько таблиц?
21 май 14, 12:41    [16047699]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Ндааа, накручено...
Вставка делается в одну таблицу, на ней висит триггер (не заметила сразу), он лезет в скалярную функцию, а в функции жестко константой прошита дата, в явно языкозависимом формате: '01 Jan 2000'. Поменяла на '20000101' - заработало. Почему на одном сервере (под пользователем А, например) формат '01 Jan 2000' воспринимается, а на другом (под пользователем Б) выдает ошибку? Региональные настройки доменного пользователя? Или что?
Там везде даты в таком формате, ой чувствую наемся... =(( надо везде переводить на универсальный формат.
21 май 14, 16:12    [16049923]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
pima
Почему на одном сервере (под пользователем А, например) формат '01 Jan 2000' воспринимается, а на другом (под пользователем Б) выдает ошибку? Региональные настройки доменного пользователя? Или что?

https://www.sql.ru/faq/faq_topic.aspx?fid=109
21 май 14, 16:14    [16049940]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Спасибо, я не совсем правильно формулирую наверное...
База - черный ящик, где что живет и откуда дергается - неизвестно, даты написаны везде в кривом формате ('01 Jan 2000'). Код менять пока не могу, т.к. задача - развернуть тестовый стенд, равный по коду боевому. Базу пользует n-е количество неизвестных утилит, каждая со своим коннекшном, они тоже должны входить в состав тестового стенда. Их тоже надо запустить в состоянии 'as is' на данный момент. Sql server agent коннектится все под виндой, и на боевом, и на тестовом. Пользователя sql01agent в Management Studio вообще не вижу, ни там, ни тут, есть только NT Service\SQLSERVERAGENT (Security - Logins - ...). Язык у них одинаковый на обоих серверах, русский. При этом на одном работает, на другом нет ((((
Ща развернем тестовый стенд и будем выпрямлять код, для этого все и делается...
21 май 14, 16:43    [16050211]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Более того: меняю на тестовом у логина NT SERVICE\SQLSERVERAGENT язык на английский, и все работает с корявым форматом даты ('01 Jan 2000'). При этом на боевом у того же логина язык - русский, и с таким же форматом все пашет нормально. На тестовом почему-то только с английским языком пользователя, меняешь на русский, как на боевом - отваливается. Что за странность?
21 май 14, 16:45    [16050231]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Это похоже группа, а не пользователь... (NT SERVICE\SQLSERVERAGENT)
ващще не понимаю...
21 май 14, 16:52    [16050292]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
nscl
Guest
в функции жестко константой прошита дата, в явно языкозависимом формате: '01 Jan 2000'
Работа с датами - вообще особая печаль в M$SQL. Мой вам добрый совет - привести все даты к единому ISO-формату вида 'YEAR-MM-DD' ('YEAR-MM-DD HH:ii:ss'). Иначе постоянные проблемы вам обеспечены. Особенно опасны даты, записанные в сокращенном формате и переданные в хранимку / запрос / прочее. Никогда заранее не знаешь, как будет интерпретирована дата вида '01.02.03' =)

Базу пользует n-е количество неизвестных утилит, каждая со своим коннекшном, они тоже должны входить в состав тестового стенда.
Средствами mgmt-studio , netstat и ревизией установленного ПО найти и задокументировать.
Хотя если вопрос так стоит - наверняка при наведении порядка что-нибудь обязательно уроните.
21 май 14, 22:40    [16051754]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
nscl
как будет интерпретирована дата вида '01.02.03'

Потому что это не дата, а строка
А с датами у MSSQL нет никакой печали. Печаль у тех, кто не отличает один тип данных от другого
21 май 14, 22:41    [16051756]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
nscl
Guest
Glory, ути-пути.

EXEC my_procedure_with_date_parameter '01.02.03'
21 май 14, 22:54    [16051800]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
nscl
EXEC my_procedure_with_date_parameter '01.02.03'

чем это "дата" лучше этой ? - EXEC my_procedure_with_date_parameter 'ути-пути'
21 май 14, 22:56    [16051803]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
nscl
Guest
Тем, что сервер её примет и обработает как дату. А вот как именно - зависит от.
Может быть как 2003-02-01, так и 2001-02-03. Встречается в старом софте гораздо чаще, чем хотелось бы.

Почему и советую привести все даты к ИСО. Проблем меньше будет.

А когда ваша дата введена в одном интерфейсе, вычитана другой программкой, потом передана параметром в хранимку, а потом ещё пережила какое-нибудь преобразование(типа процедур эскспорта/импорта) - то именно _текстовое_ представление в пригодном для однозначного парсинга и стандартизированном ISO-формате - это единственный способ гарантировать однозначность и безошибочность интерпретации дат на всём их тяжком пути.

Пример:

EXEC export_ostatki '2003-02-01'
EXEC export_ostatki '2001-02-03'

сравните с

EXEC export_ostatki '01.02.03'
21 май 14, 23:09    [16051862]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
nscl
Тем, что сервер её примет и обработает как дату.

Круто. Т.е. неяное преобразование типов - это "особая печаль MSSQL"?
А я то думал, это криворукие программисты.

nscl
А когда ваша дата введена в одном интерфейсе, вычитана другой программкой, потом передана параметром в хранимку, а потом ещё пережила какое-нибудь преобразование(типа процедур эскспорта/импорта) - то именно _текстовое_ представление в пригодном для однозначного парсинга и стандартизированном ISO-формате - это единственный способ гарантировать однозначность и безошибочность интерпретации дат на всём их тяжком пути.

если бы мой интерфейс опрерировал типом дата, а не строка, то не надо было бы что-то там "гарантировать"

Сообщение было отредактировано: 21 май 14, 23:16
21 май 14, 23:13    [16051880]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
nscl
Guest
Если бы все программисты были пряморукие - этот форум прекратил бы своё существование за ненадобностью. Перечитайте первый пост ТС-а.
21 май 14, 23:15    [16051889]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
nscl
Если бы все программисты были пряморукие - этот форум прекратил бы своё существование за ненадобностью. Перечитайте первый пост ТС-а.

А причем тут тогда "Работа с датами - вообще особая печаль в M$SQL", если программисты не отличают один тип от другого ?
21 май 14, 23:17    [16051899]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
nscl
Guest
Glory
если бы мой интерфейс оперировал типом дата, а не строка, то не надо было бы что-то там "гарантировать"
Перечитайте ТС-овские посты. Проблемы с интерпретацией дат объективно есть. Подсказку вам дам - импорт данных из CSV.
Там данные исходно идут _строковые_, и никак иначе.
И таких случаев - вагон и две телеги. Вы не сможете жить на идеальном сферическом сервере СУБД без взаимодействия с внешним миром, где представления о типах данных вовсе не обязаны совпадать с местечковыми представлениями микрософта.

Прочитайте http://ru.wikipedia.org/wiki/ISO_8601 и не несите пургу. Даты вида '20 Jan 2000', указанные автором темы, обработка которых в сервере СУБД падает при смене локали пользователя - это треш, угар и содомия. Такую дату допустимо выдать в csv-_экспорте_ (и то не желательно) или в конечном пользовательском интерфейсе. А вот в параметрах и текстах запросов такого треша быть не должно.

Что касается внутренней организации типа данных, то мне, как адепту пыха и питона, на это в 99.9% случаев глубоко фиолетово.
Ситуация, когда смена локализации ломает логику работы БД - абсолютно ненормальна.
21 май 14, 23:30    [16051957]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
nscl
Guest
Читать срочно:
http://msdn.microsoft.com/ru-ru/library/ms190977(SQL.90).aspx
21 май 14, 23:35    [16051979]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
nscl
Guest
Glory, а теперь давайте вы посмотрите вот это ман в мсдн:

http://msdn.microsoft.com/ru-ru/library/ms180878(v=sql.90).aspx ,

найдете там вот этот запрос в первом же примере:
CREATE VIEW dbo.USA_Dates AS
SELECT PurchaseOrderID, TotalDue
FROM AdventureWorks.Purchasing.PurchaseOrderHeader
WHERE OrderDate < 'May 1, 2002';

и снова поумничаете про типы данных.
21 май 14, 23:38    [16051987]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
nscl
найдете там вот этот запрос в первом же примере:

Что мне показывает этот пример ?
Опять "особую печаль MSSQL" ?

nscl
и снова поумничаете про типы данных.

Ну так понятно, что умные оперируют всеми типами данных, а не только одним.

nscl
Перечитайте ТС-овские посты. Проблемы с интерпретацией дат объективно есть. Подсказку вам дам - импорт данных из CSV.

Это ТС рассказал про "особую печаль MSSQL" ?
Или все же вы ?
"импорт данных из CSV" - это инструкция TSQL такая ? Или опять кривонаписанный интрефейс ?
21 май 14, 23:46    [16052029]     Ответить | Цитировать Сообщить модератору
 Re: SqlServer Agent - ошибка обработки даты  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
nscl, Вы принимаете пользовательское представление даты в виде строки за тип данных времени MS SQL что ли? Дату/время можно получить путем как неявных так и явных преобразований символьных строк, целых чисел, вычислением специальных функций и проч. То, что Вы написали - типом данных времени не является, на что Glory и обращал внимание.
21 май 14, 23:48    [16052036]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить