У меня строковая структура выглядит как ID bigint, ScanRept XML
Я хочу получить файл с именем 4.xml, содержащий только xml из столбца ScanRept, где номер ID равен 4.
Я не хочу делать это в интерактивном режиме (зайдя в Manager Studio, найдя строку, щелкнув поле правой кнопкой мыши и выбрав «Сохранить как») - это то, что я сделаю, если не смогу придумать лучший способ.
У меня есть доступный C#; если это возможно с sqlcmd, это мое предпочтение (потому что, вероятно, будет много вариантов, которых я не могу предвидеть прямо сейчас).





Вероятно, есть лучший способ сделать это ... но без тестирования что-то вроде этого может сработать.
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();
}
Подход командной строки с 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
Спасибо вам обоим - хорошие подсказки
Panos, он обрезается после определенной длины - 258 символов?
Toytown, который работает, кроме писателя. WriteRaw () - это то, что мне нужно, иначе он кодирует разметку XML, чтобы сделать его действительными данными, например, <превращается в амперсанд lt точка с запятой
Пока я не могу получить ничего, кроме одного длинного потока xml (без отступов, без разрывов строк). Я не уверен, есть ли в моих данных какие-либо пробелы форматирования, но я знаю, что когда я щелкаю правой кнопкой мыши поле в SSMS, появляется редактор MS XML, показывающий, что все это красиво отформатировано.
Ну, как говорят французы: «Этот чертов XML - головная боль для французской Too-SHEE». Оба ваших комментария помогают, и я проголосую за ваши ответы, как только зарегистрируюсь на этой чертовой вещи с открытым идентификатором.
Вот еще один подход, который позволил ему красиво описать это, как любят горячие французские девушки:
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) ;