sql server bcp xml data - PullRequest
       8

sql server bcp xml data

1 голос
/ 15 января 2009

У меня есть таблица со столбцом типа xml. Я должен извлечь данные из этой таблицы и загрузить данные в другую среду. Я использую BCP для извлечения и размещения целевой таблицы, но есть некоторые специальные символы, которые вызывают некоторые проблемы, когда я помещаю их в целевую таблицу. есть ли обходные пути

спасибо Ben

1 Ответ

3 голосов
/ 16 января 2009

Пользовательский CLR-SP предоставил мне лучшее решение. Теперь я могу записывать данные в формате XML напрямую в файл из TSQL при условии, что учетная запись службы SQL имеет разрешение на файл. Это позволяет простой синтаксис:

exec dbo.clr_xml2file @xml, @path, @bool_overwrite

ИП:

CREATE PROCEDURE [dbo].[clr_xml2file]
    @xml [xml],
    @file [nvarchar](max),
    @overwrite [bit]
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [CLR_FileIO].[FreddyB.FileIO].[Xml2File]

C # для библиотеки CLR:

using System;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using System.Security.Principal;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using Microsoft.SqlServer.Server;

namespace FreddyB
{  
  public class FileIO
  {
    public static void Xml2File(
      SqlXml xml, 
      SqlString sFile, 
      SqlBoolean bOverwrite
    ) {

      SqlPipe sqlpipe = SqlContext.Pipe;
      try
      {
        if (xml == null || xml.IsNull || xml.Value.Length == 0) {
          sqlpipe.Send("Cannot write empty content to file : \n\t"
            +sFile.Value);
          return;
        }

        if (File.Exists(sFile.Value) & bOverwrite.IsFalse) {
          sqlpipe.Send("File already exists : \n\t"+sFile.Value);
          return;
        }

        int iFileSize = 0;
        FileStream fs = null;
        try {
          byte[] ba = Encoding.UTF8.GetBytes(xml.Value);
          iFileSize = ba.Length;

          fs = new FileStream(sFile.Value, FileMode.Create, FileAccess.Write);
          fs.Write(ba, 0, ba.Length);

          sqlpipe.Send("Wrote "
            +String.Format("{0:0,0.0}",iFileSize/1024)
            +" KB to : \n\t"
            +sFile.Value);
        }
        catch (Exception ex) 
        {
          sqlpipe.Send("Error as '"
            +WindowsIdentity.GetCurrent().Name
            +"' during file write : \n\t"
            +ex.Message);
          sqlpipe.Send("Stack trace : \n"+ex.StackTrace);
        }
        finally
        {
          if (fs != null) {
            fs.Close();
          }
        }
      }
      catch (Exception ex)
      {
        sqlpipe.Send("Error writing to file : \n\t"
          +ex.Message);
      }
    }
  }
}
...