2015-06-25 5 views
0

Нашел этот вопрос here о переполнении стека, который я нашел очень полезным, чтобы вытащить все имена таблиц и соответствующие столбцы из базы данных SP2 Microsoft SQL Server Enterprise Edition (64-разрядной версии) 10.50.4286.Попытка форматировать результаты SQL-запроса

SELECT o.Name, c.Name 
FROM  sys.columns c 
JOIN  sys.objects o ON o.object_id = c.object_id 
WHERE o.type = 'U' 
ORDER BY o.Name, c.Name 

Он создает таблицу с двумя столбцами, как это, каждая строка содержит имя таблицы в колонке 01 и corressponding столбцов в колонке 02:

enter image description here

То, что я действительно хочу, однако что-то как это, один столбец для каждого имени таблицы и столбцы таблицы перечислены ниже него, как это:

enter image description here

Я уже начал делать это вручную в Excel, но с более чем 5000 строк вернулось, было бы очень приятно, если бы был способ отформатировать результаты в самом запросе, чтобы выглядеть так. Заранее спасибо!

+0

вы хотите выход в первенствует ли? – Amit

+0

Первым примером является перечисление имени таблицы и имени столбца для пользовательских таблиц (это условие 'o.type = 'U''). Но мы понятия не имеем, какие четыре столбца вы хотите. Пожалуйста, четко укажите, какие данные вы хотите. – Richard

+0

@ Amit - Я запускаю запрос в SQL Server Management Studio 2012, затем выбираю все в результатах и ​​копирую с заголовками и вставляю в Excel. Поэтому я думаю, что ответ «да», мне хотелось бы получить конечный результат в Excel, но мне не нужен код, чтобы сделать это автоматически - надеюсь, что ответит на ваш вопрос. @ Ричард - мне все еще нужны все таблицы и столбцы, я просто надеялся, что выйдет в SQLSMS2012, чтобы отобразить его в формате во втором подборке, поэтому мне не нужно реорганизовать вручную - подумал, может быть, был способ изменить запрос или код форматирования объявления для запроса. Спасибо за ответ. – n00b

ответ

2

Как все говорят вам, это это не-SQL-y вещь. У вашего набора результатов будет произвольное количество столбцов (равное количеству пользовательских таблиц в вашей базе данных, которое может быть огромным). Поскольку набор результатов должен быть прямоугольным, он будет иметь столько строк, сколько максимум количество столбцов в любой из ваших таблиц, поэтому многие из значений будут NULL.

Тем не менее, простой динамический PIVOT получает вас, что вы хотите:

DECLARE @columns nvarchar(max); 
DECLARE @sql nvarchar(max); 

SET @columns = STUFF (( 
        SELECT '],[' + t.name 
        FROM sys.tables t 
        WHERE t.type = 'U' 
        FOR XML PATH('')), 1, 2, '') 
       + ']'; 

SET @sql = ' 
    SELECT ' + @columns + ' 
    FROM 
    ( 
     SELECT t.Name tName 
       , c.Name cName 
       , ROW_NUMBER() OVER (PARTITION BY t.Name ORDER BY c.Name) rn 
     FROM  sys.columns c 
     JOIN  sys.tables t ON t.object_id = c.object_id 
     WHERE t.type = ''U'' 
    ) raw 
    PIVOT (MAX(cName) FOR tName IN (' + @columns + ')) 
    AS pvt; 
    '; 

EXECUTE(@sql); 

Это то, что он производит на моей базе данных master:

spt_fallback_db  spt_fallback_dev spt_fallback_usg spt_monitor  MSreplication_options 
------------------- ------------------- ------------------- --------------- ---------------------- 
dbid    high    dbid    connections  install_failures 
name    low     lstart    cpu_busy  major_version 
status    name    segmap    idle   minor_version 
version    phyname    sizepg    io_busy   optname 
xdttm_ins   status    vstart    lastrun   revision 
xdttm_last_ins_upd xdttm_ins   xdttm_ins   pack_errors  value 
xfallback_dbid  xdttm_last_ins_upd xdttm_last_ins_upd pack_received NULL 
xserver_name  xfallback_drive  xfallback_vstart pack_sent  NULL 
NULL    xfallback_low  xserver_name  total_errors NULL 
NULL    xserver_name  NULL    total_read  NULL 
NULL    NULL    NULL    total_write  NULL 

(11 row(s) affected) 
+0

Это именно то, что мне нужно, спасибо! Я понимаю, что это не обычный SQL-запрос, потому что я делаю это, база данных предназначена для инструмента управления программным обеспечением и содержит очень хорошую информацию об аудите компьютера, но никто не знает или не может найти документацию о том, что таблицы/столбцы для. Поэтому я планирую добавлять столбцы в эту таблицу с примерными данными, надеясь, что это упростит определение того, что каждый столбец и для чего мы можем его использовать. Это спасло меня от ручной обработки Excel. – n00b

0

Это может быть проще всего сделать, например, что-то вроде этого:

  1. Построить запятую список, используя для пути XML, например, как this.
  2. Затем скопировать этот результат, чтобы преуспеть и использовать данные для столбцов, чтобы создать отдельные столбцы из элементов
  3. Использование копирования + вставить специальный -> транспонировать превратить строки в столбцы
+0

Спасибо за ответ - не уверен, что это сработает для меня, я только прочитал доступ к базе данных, и это DB приложения. Требуется ли ссылка для создания новой базы данных в базе данных? Или это просто изменит таблицу, которую производит запрос для отображения результатов? Я не решаюсь создать новую таблицу непосредственно в базе данных и даже не уверен, что у меня есть права на это, если это то, что делает этот код. – n00b

Смежные вопросы