Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > MS SQL

Автоматическое заполнение таблицы из текста - возможно ли? : MS SQL

26.04.2024 13:02


14.09.2015 02:01
KirillHome
 
Есть база (не MS SQL), из которой раз в 10 минут выгружается структурированный текстовый файл с полным справочником товаров, штрихкодов, цен и остатков.

Есть таблица в MS SQL, куда этот текстовый файл можно закачать

SQL код:
TRUNCATE TABLE [BaseName].[dbo].[TableName];
BULK INSERT [BaseName].[dbo].[TableNameFROM 'D:\Temp\FullAnsi.txt'
WITH
(CODEPAGE='1251',
 
FIELDTERMINATOR '    '); 
Написана программа для клиентов, которые могут искать в этой базе товар по штрихкоду, коду, артикулу, наименованию.

Вопрос - можно ли средствами MS SQL Server Express проверять наличие этого текстового файла, и, при его наличии - выполнить указанную выше загрузку и удалить текстовый файл?

Т.е. понятно, что можно запускать и бат-файл, который будет это делать...
К примеру
Код:
@echo off
set FName=D:\Temp\FullAnsi.txt
:str
if exist %FName% (
  "C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\osql" -S .\SQLEXPRESS -E -n -Q "TRUNCATE TABLE [BaseName].[dbo].[TableName]; BULK INSERT [BaseName].[dbo].[TableName] FROM '%FName%' WITH (CODEPAGE='1251',FIELDTERMINATOR = '	')"
  del /Q %Fname% 
)
ping -n 60 127.0.0.1 >nul
goto :str
Но совершенно не хочется этого делать

Т.е. задача - заставить MS SQL SERVER самого что-то сделать по событию (по расписанию?), без запуска других приложений, без написания каких-либо программ и т.п.
14.09.2015 03:41
aldemko
 
Цитата:
KirillHome
Код:
@echo off
set FName=D:\Temp\FullAnsi.txt
:str
if exist %FName% (
  "C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\osql" -S .\SQLEXPRESS -E -n -Q "TRUNCATE TABLE [BaseName].[dbo].[TableName]; BULK INSERT [BaseName].[dbo].[TableName] FROM '%FName%' WITH (CODEPAGE='1251',FIELDTERMINATOR = '	')"
  del /Q %Fname% 
)
ping -n 60 127.0.0.1 >nul
goto :str
Но совершенно не хочется этого делать
Не супер решение конечно, но если вдруг не найдешь решения, а запускать самому не вариант (каждые 10 минут то)
можно попробовать этот батник запускать Планировщиком заданий
мне к примеру это помогло в этом Skype - Вход невозможен ввиду ошибки передачи данных
но этот, вариант ты уже скорее всего рассматривал, и не подошел наверное.
Но мне кажется если не будет решения того что бы MS SQL это сам делал - я думаю не плохой вариант
14.09.2015 07:47
OlegON
 
В Oracle есть объект directory, позволяющий работать с файлами. Навскидку в MS SQL такого не увидел, но результаты гугления забиты восстановлением, может, где-то ниже есть...
Вообще - нельзя ли делать инсерт из этого файла, а в случае успеха - удалять старое?
14.09.2015 10:16
KirillHome
 
В ночи переделал bat-файл.
Запускается он один раз, при старте компьютера, дальше - он зациклен.

Логика проста - раз в минуту запускается проверка на существование "нового текстового файла", и на его сравнение со "старым".
Если "нового" нет - продолжаем ждать.
Если "новый" есть и совпадает со "старым" - удаляем "новый" и продолжаем ждать
Если "новый" есть и не совпадает со "старым" - закачиваем информацию из "нового" в базу, переименовываем "новый" в старый" - и продолжаем ждать.
Всё пишется в лог-файл.

Оставим это дело "на память" (файл в кодировке 1251, разделитель - табуляция).

Код:
@echo off
set FPath=D:\Temp\TimeFull\
set FName=FullAnsi.txt
set FNameOld=FullAnsiOld.txt
set Flog=logFile.txt
echo.>%FPath%%FLog%

:str
set FCRes=ForDif
if exist %FPath%%FName% (
   fc %FPath%%FName% %FPath%%FNameOld% /b >nul 2>&1 && set FCRes=Yes|| set FCRes=No
)
if %FCRes% == ForDif (
   echo %date% %time% Файл %FPath%%FName% не существует!>>%FPath%%FLog%
   goto :prd
)
if %FCRes% == Yes (
   echo %date% %time% Файлы %FPath%%FName% и %FPath%%FNameOld% совпали, удаляем новый>>%FPath%%FLog%
   del /Q %FPath%%FName% > NUL
   goto :prd
)
if %FCRes% == No (
   echo %date% %time% Файлы %FPath%%FName% и %FPath%%FNameOld% - НЕ совпали! Перезапишем базу>>%FPath%%FLog%
   "C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\osql" -S .\SQLEXPRESS -E -n -Q "TRUNCATE TABLE [BaseName].[dbo].[TableName]; BULK INSERT [BaseName].[dbo].[TableName] FROM '%FPath%%FName%' WITH (CODEPAGE='1251',FIELDTERMINATOR = '	')" >>%FPath%%FLog%
   echo %date% %time% База перезаписана>>%FPath%%FLog%
   move %FPath%%FName% %FPath%%FNameOld% > NUL
) 
:prd
echo ===================================================>> %FPath%%FLog%
ping -n 60 127.0.0.1 >nul
goto :str
Это понятно, но - какой-то костыль.
Должен же MS SQL Server Express не только на запросы отвечать, но (по моему мнению) уметь какие-то задачи делать в фоне. И вроде я находил что-то про "перестроение индексов" именно в фоне (регламентными заданиями MS SQL Server).
Но вот через что к этому "фону" прорваться?
14.09.2015 10:26
aldemko
 
Может не то, да даже скорее всего не то
но ты тут упомянул про регламент - а в поиске часто упоминают MS SQL Server Management Studi
вот например здесь
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 21 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащийся здесь.
Часовой пояс GMT +3, время: 13:02.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.