SQL Server 2005 - получить поле XML в файл; некоторые поля XML в свои файлы - PullRequest
0 голосов
/ 07 ноября 2008

У меня структура строк выглядит как идентификатор bigint, ScanRept XML

Я хочу получить файл с именем 4.xml, содержащий только xml из столбца ScanRept, где идентификационный номер равен 4.

Я не хочу делать это в интерактивном режиме (зайдя в Manager Studio, найдя строку, щелкнув правой кнопкой мыши по полю и выполнив Save AS) - это то, что я сделаю, если не смогу найти лучший способ ,

У меня есть C # в наличии; если это выполнимо с sqlcmd, это мое предпочтение (потому что, вероятно, будет много вариантов, которых я сейчас не могу предвидеть).

Ответы [ 4 ]

0 голосов
/ 08 ноября 2008

Вот еще один подход, который позволяет писать это довольно, как горячие франшы, вроде:

        string IRIXno = args[0] ;

        string connectionString ;

        string query = "Select ID, Report FROM Reports WHERE id =" + IRIXno;

        try

        {

            connectionString = ConfigurationSettings.AppSettings["ConnectionString"];

        }

        catch

        {

            Console.WriteLine("YOur connection string isn't set or something.");

            return;

        }

        SqlConnection conn = new SqlConnection(connectionString);

        conn.Open();

        SqlCommand sqlComm = new SqlCommand(query, conn);

        sqlComm.CommandType = CommandType.Text;

        SqlDataReader reader = sqlComm.ExecuteReader();

        reader.Read(); // one and only row

        XmlDocument doc = new XmlDocument();

        XmlReader xmlReader = reader.GetSqlXml(1).CreateReader() ;//second column is our guy

        doc.Load(xmlReader); 


        string outfile = "H:\\" + IRIXno + ".xml";

        doc.Save(outfile) ;
0 голосов
/ 07 ноября 2008

Подход командной строки с bcp:

bcp "SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4" queryout 4.xml -c -S<ServerName> -U<UserName> -P<Password>

или для доверенных соединений

bcp "SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4" queryout 4.xml -c -S<ServerName> -T

Подход командной строки с sqlcmd:

sqlcmd -U<Username> -P<Password> -S<ServerName> -h -1 -Q "SET NOCOUNT ON SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4;" -o 4.xml

или для доверенных соединений

sqlcmd -E -S<ServerName> -h -1 -Q "SET NOCOUNT ON SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4;" -o 4.xml
0 голосов
/ 07 ноября 2008

Спасибо вам обоим - хорошие советы

Панос, он усекается после определенной длины - что составляет 258 символов?

Toytown, который работает, кроме writer.WriteRaw () - это то, что мне нужно, иначе он кодирует разметку XML, чтобы сделать ее действительными данными, например, <превращается в амперсанд и точку с запятой </p>

Пока что я не могу получить ничего, кроме одного длинного потока XML (без отступов, без разрывов строк). Я не уверен, есть ли в моих данных какой-либо пробел для форматирования, но я знаю, что когда я щелкаю правой кнопкой мыши по полю в SSMS, он вызывает редактор MS XML, показывающий, что все это отформатировано довольно.

Ну, как говорят французы: «Этот чертов XML - это боль во французском Too-SHEE». Оба ваших комментария помогают, и я буду голосовать за ваши ответы, как только я зарегистрируюсь на этом чёртовом открытом идентификаторе.

0 голосов
/ 07 ноября 2008

Возможно, есть лучший способ сделать это ... но без тестирования что-то подобное может сработать. C #

SqlDataAdapter adapter = new SqlDataAdapter("SELECT ID, ScanRept FROM TableName", "connString");
DataTable dt = new DataTable();
adapter.Fill(dt);

foreach (DataRow row in dt.Rows)
{
    string type = row["ID"].ToString();
    string location = "C\\" + type + ".xml";
    string xml = row["ScanRept"].ToString();
    XmlTextWriter writer = new XmlTextWriter(location, null);
    writer.WriteString(xml);
    writer.Flush();
    writer.Close();
}
...