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

Откуда:
Сообщений: 207
Есть пакет который импортирует текстовый файл в таблицу. Там иногда встречаются строки где все символы null т.е. с кодом 00
Строк где есть и такие символы и обычный текст нет. Или только нормальный текст или же символы с кодом 00.
Function Main()
'On Error GoTo -1
if IsNumeric( DTSSource("Col001") ) then
	DTSDestination("InKGP_index") = DTSSource("Col001")
	DTSDestination("InKGP_KGP") = DTSSource("Col002")
	DTSDestination("InKGP_strana") = DTSSource("Col003")
	DTSDestination("InKGP_gorod") = DTSSource("Col004")
	DTSDestination("InKGP_face") = DTSSource("Col005")
	DTSDestination("InKGP_name") = DTSSource("Col006")
	DTSDestination("InKGP_data") = DTSSource("Col007")
	Main = DTSTransformStat_OK
else
	Main = DTSTransformStat_SkipRow
end if
End Function
Как обойти эти строки?
19 окт 05, 15:48    [1984569]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
ruslrain
Member

Откуда:
Сообщений: 114
не очень понятно с вопросом. Слишком мудрено написано, но из того что я понял сделал бы так:
Function Main()

IF IsNull( DTSSource("Col001") ) then
	Main = DTSTransformStat_SkipRow
ELSE
	.....
	Main = DTSTransformStat_OK
END IF

End Function


или
Function Main()

IF TRIM( DTSSource("Col001") )="00"  then
	Main = DTSTransformStat_SkipRow
ELSE
	.....
	Main = DTSTransformStat_OK
END IF

End Function

19 окт 05, 17:07    [1985107]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
это код ActiveX Script-а для копирования внутри Transform Data Task-а. Приложенный файл - часть файла который не импортируется. В данном случае такая строка последняя. Это UNIX-файл фиксированной ширины. Кстати, строка с null значениями на 1 символ больше.

К сообщению приложен файл (bad_idxkgp.txt - 1Kb) cкачать
20 окт 05, 09:44    [1986444]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
Так тоже не получается
Function Main()
if not IsNull( DTSSource("Col001") ) then
	DTSDestination("InKGP_index") = DTSSource("Col001")
	DTSDestination("InKGP_KGP") = DTSSource("Col002")
	DTSDestination("InKGP_strana") = DTSSource("Col003")
	DTSDestination("InKGP_gorod") = DTSSource("Col004")
	DTSDestination("InKGP_face") = DTSSource("Col005")
	DTSDestination("InKGP_name") = DTSSource("Col006")
	DTSDestination("InKGP_data") = DTSSource("Col007")
	Main = DTSTransformStat_OK
else
	Main = DTSTransformStat_SkipRow
end if
End Function
20 окт 05, 09:46    [1986455]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это ?
If Asc(DTSSource("Col001") ) = 0
20 окт 05, 10:01    [1986537]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
2 Glory
Нет. То же самое.

Длина строк 81 символов. Последняя строка 82 null-а.
Не зависимо от проверки выдается такая ошибка.

---------------------------
Package Error
---------------------------
Error Source : Microsoft Data Transformation Services Flat File Rowset Provider

Error Description : Too many columns found in the current row; non-whitespace characters were found after the last defined column's data.

---------------------------
OK
---------------------------

Если удалить послений 82 null то сообшение ошибки становиться другой.

---------------------------
Package Error
---------------------------
Error Source : Microsoft OLE DB Provider for SQL Server

Error Description : The number of failing rows exceeds the maximum specified.
Insert error, column 7 ('InKGP_data', DBTYPE_I4), status 10: Integrity violation; attempt to insert NULL data or data which violates constraints.
Insert error, column 5 ('InKGP_face', DBTYPE_I2), status 10: Integrity violation; attempt to insert NULL data or data which violates constraints.
ююю
Unspecified error

---------------------------
OK
---------------------------

Ситуация исправляется если удалить 81-й null тоже, т.е. null-ей в последней строке не 82 и 81, а 80, строка на один короче других.
Наверно придется писать программу которая долженая будет перед импортом удалить эти строки.
20 окт 05, 10:44    [1986783]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вы уверены что в строке именно null-ы ? Какой ASCII код им соответствует ?

dim x
x = chr(0)+chr(0)+chr(65)
if isempty(x) then
	msgbox "Empty"
end if

if isnull(x) then
	msgbox "Null"
end if

msgbox asc(x)
20 окт 05, 10:47    [1986808]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
я сделал так
20 окт 05, 10:57    [1986849]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
я сделал так

Function Main()


dim x
'x = chr(0)+chr(0)+chr(65)
x = DTSSource("Col001")
if isempty(x) then
	msgbox "Empty"
end if

if isnull(x) then
	msgbox "Null"
end if

msgbox asc(x)



if not IsNull( DTSSource("Col001") ) then
'If Asc(DTSSource("Col001") ) = 0 then
	DTSDestination("InKGP_index") = DTSSource("Col001")
	DTSDestination("InKGP_KGP") = DTSSource("Col002")
	DTSDestination("InKGP_strana") = DTSSource("Col003")
	DTSDestination("InKGP_gorod") = DTSSource("Col004")
	DTSDestination("InKGP_face") = DTSSource("Col005")
	DTSDestination("InKGP_name") = DTSSource("Col006")
	DTSDestination("InKGP_data") = DTSSource("Col007")
	Main = DTSTransformStat_OK
else
	Main = DTSTransformStat_SkipRow
end if
End Function

Ни сообщения "Empty" ни "Null" не выходит. Мне кажется дело не в значении Null или еще чего-то, а длине сроки с Null-ами. Ведь она выдает Too many columns found in the current row; или же The number of failing rows exceeds the maximum specified. И все работает если строку и Null-ами сделать 80 Null-ей, хотя обычные строки 81 символов.
20 окт 05, 11:00    [1986883]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ведь она выдает Too many columns found in the current row;
Это сообщение обработки строки ДО вашего скрипта. Означает, что сервер не смог правильно распарсить текущую строку файла.
У вас файл с разделителем ?
20 окт 05, 11:05    [1986922]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
я часть файла приложил

https://www.sql.ru/forum/actualthread.aspx?tid=227267#1986444
20 окт 05, 11:19    [1987042]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
ruslrain
Member

Откуда:
Сообщений: 114
Файл я посмотрел. А можно написать что из него нужно получить. А то как то не понятно, что требуется и каким рутем идти
20 окт 05, 13:09    [1987747]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
Есть такая таблица
CREATE TABLE [dbo].[IndexKGP] (
	[InKGP_index] [int] NOT NULL ,
	[InKGP_KGP] [int] NOT NULL ,
	[InKGP_strana] [smallint] NOT NULL ,
	[InKGP_gorod] [int] NOT NULL ,
	[InKGP_face] [smallint] NOT NULL ,
	[InKGP_name] [nvarchar] (40) COLLATE Cyrillic_General_CI_AS NULL ,
	[InKGP_data] [int] NOT NULL 
)

этот файл надо импортировать в эту таблицу. Вот как надо поставить линии разделения строки файла: 9, 9, 3, 9, 3, 40, 8.
20 окт 05, 13:16    [1987793]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Tural
Вот как надо поставить линии разделения строки файла: 9, 9, 3, 9, 3, 40, 8.

Не получится. Придется ставить что столбец в файле один. И внутри Transformation самому определять как парсить ту или иную строку
20 окт 05, 13:29    [1987894]     Ответить | Цитировать Сообщить модератору
 Re: как в DTS обойти строки с символами null  [new]
Tural
Member

Откуда:
Сообщений: 207
Ясно. Спасибо.
20 окт 05, 14:03    [1988144]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить