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

Откуда:
Сообщений: 1
Добрый день.
Подскажите, пожалуйста, каким образом можно построить таблицу из xml файла, расположенного на web-странице?

Можно ли записать xml-код с веб-страницы в переменную типа xml с помощью OPENROWSET, а потом использовать OPENXML и т.д.
Если, да, то очень прошу пример.

Заранее спасибо.
20 авг 16, 15:55    [19567455]     Ответить | Цитировать Сообщить модератору
 Re: импорт данных из xml-файла в интернете в таблицу MS SQL SERVER  [new]
aleks2
Guest
+
# загрузка данных
# параметры
param(
  [string]$VerbosePreference = "continue"   # вариант SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend" 
)

$host.ui.RawUI.WindowTitle = "Загрузка цен";

#1. Открываем подключение к серверу

$scriptFolder = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

$errorLogFile = $scriptFolder + "\Data.err"
$xmlErrorLogFile = $scriptFolder + "\SQLXMLBulkLoad.error.log"

If ( Test-Path $errorLogFile ){
	Remove-Item $errorLogFile
}

$connectionString = "Server=.\MORETRAVEL;Database=Avalon2009;Integrated Security=True;"
$connectionString_xmlBulkLoad = "provider=SQLOLEDB;data source=.\moretravel;database=tempdb;integrated security=SSPI"

# для списка загрузки
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText = “dbo.tourethnoGetPriceLoadList”
$command.CommandType = [System.Data.CommandType]'StoredProcedure'

#2. Запрашиваем данные 
$dataToLoad = $command.ExecuteReader([System.Data.CommandBehavior]::SingleResult)

$errcnt = 0

if ($dataToLoad.HasRows) {

      $cnt = 0
      Write-Verbose ''
      Write-Verbose 'Генерируем схему'

      # для загрузки файлов с интернету
      $downloader = New-Object System.Net.WebClient

      # для загрузки файлов в ms sql
      $xmlbulkloader = New-Object -Com SQLXMLBulkLoad.SQLXMLBulkLoad
      $xmlbulkloader.ConnectionString = $connectionString_xmlBulkLoad
      $xmlbulkloader.ErrorLogFile = $xmlErrorLogFile
      $xmlbulkloader.CheckConstraints = 0
      $xmlbulkloader.XMLFragment = 0
      $xmlbulkloader.SchemaGen = 1
      $xmlbulkloader.SGDropTables = 1
      $xmlbulkloader.ForceTableLock = 1
      $xmlbulkloader.BulkLoad = 0

      #для списка файлов и генерации схемы
      $conGetFiles = New-Object System.Data.SqlClient.SqlConnection
      $conGetFiles.ConnectionString = $connectionString
      $conGetFiles.Open()
      $cmdGetFiles = $conGetFiles.CreateCommand()
      $cmdGetFiles.CommandType = [System.Data.CommandType]'StoredProcedure'

      #для генерации схемы
      $cmdGetFiles.CommandText = "dbo.tourethnoGetPriceSchemaList"
      
      $schema = $cmdGetFiles.ExecuteReader([System.Data.CommandBehavior]::SingleResult)
      if ($schema.HasRows) {

        while ( $schema.Read() ) {
      
             $file =      $scriptFolder + '\' + $schema.Item('file')
             $xmlschema = $scriptFolder + '\' + $schema.Item('xmlschema')
             $str = [string]::Format( 'схема: File = {0}; XmlSchema = {1};', $file, $xmlschema )
             Write-Verbose $str

             Try{
      
               # грузим схему в базу
               $xmlbulkloader.Execute( $xmlschema, $file )

             } catch {
               
               $errcnt = $errcnt + 1
               $ErrorMessage = $_.Exception.Message
               Write-Verbose $ErrorMessage

               $str = "файл: " + $file
               Add-Content $errorLogFile -value $str
               $str = "схема: " + $xmlschema
               Add-Content $errorLogFile -value $str
               Add-Content $errorLogFile -value $ErrorMessage
               If ( Test-Path $xmlErrorLogFile ){
                  add-content $errorLogFile -value ( get-content $xmlErrorLogFile )
               }

             }
       }
      }
      $schema.Dispose();
      $conGetFiles.Close();

      Write-Verbose ''
      Write-Verbose 'Читаем данные по загрузке'

      # отключаем генерацию схемы
      $xmlbulkloader.SchemaGen = 0
      $xmlbulkloader.SGDropTables = 0  
      $xmlbulkloader.BulkLoad = 1      

      #3. загрузка данных  
      $step = 0
           
      while ( $dataToLoad.Read() ) {
              
            $cnt = $cnt + 1;
             
             $url =       $dataToLoad.Item('url')
             $file =      $scriptFolder + '\' + $dataToLoad.Item('file')
             $xmlschema = $scriptFolder + '\' + $dataToLoad.Item('xmlschema')
             #$fhideerror= $filesToDownload.Item('fHideError')
             #$fIgnoreDuplicateKey= $filesToDownload.Item('fIgnoreDuplicateKey')
             
             $str = [string]::Format( 'Url = {0}; File = {1}; XmlSchema = {2};', $url, $file, $xmlschema )
             Write-Verbose $str
             #$str = [string]::Format( 'параметры fHidEerror = {0}; fIgnoreDuplicateKeys = {1}', $fhideerror, $fIgnoreDuplicateKey )
             #Write-Verbose $str

             #$xmlbulkloader.IgnoreDuplicateKeys = $fIgnoreDuplicateKey;
             
             if ( $downloader.Headers.Item('Accept') -ne 'application/xml' ) {
                $downloader.Headers.Add('Accept', 'application/xml')
             }

             If ( Test-Path $xmlErrorLogFile ){
	            Remove-Item $xmlErrorLogFile
             }

             Try{

               # грузим файл с интернету
               $str = [string]::Format( 'Запрос с интернета {0}...', $cnt )
               Write-Verbose $str
               $downloader.DownloadFile($url, $file)

               # грузим файл в базу
               Write-Verbose "Грузим в базу..."
               $xmlbulkloader.Execute( $xmlschema, $file )
               Write-Verbose "завершено."

             } catch {
               
               $errcnt = $errcnt + 1
               $ErrorMessage = $_.Exception.Message
               Write-Verbose $ErrorMessage

               $str = $partner + ": " + $partnerID
               Add-Content $errorLogFile -value $str
               $str = "шаг: " + $step
               Add-Content $errorLogFile -value $str
               Add-Content $errorLogFile -value $ErrorMessage
               Add-Content $errorLogFile -value $url
               If ( Test-Path $file ){
                  add-content $errorLogFile -value ( get-content $file )
               }
               Add-Content $errorLogFile $xmlschema
               If ( Test-Path $xmlErrorLogFile ){
                  add-content $errorLogFile -value ( get-content $xmlErrorLogFile )
               }

             }

       }

       $str = [string]::Format( 'Ошибок = {0}; Всего = {1}', $errcnt, $cnt )
       Write-Verbose $str

       $dataToLoad.Close()

      # прибираемся
      $dataToLoad.Dispose()
      $conGetFiles.Dispose()
      [System.Runtime.InteropServices.Marshal]::ReleaseComObject( $xmlbulkloader )
      $xmlbulkloader = $null

} else {

      throw 'Ошибка: нет данных для загрузки.'
      Exit

}

# прибираемся
$command.Dispose()
$connection.Dispose()


Сообщение было отредактировано: 20 авг 16, 22:21
20 авг 16, 20:28    [19568187]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить