Динамическое количество полей в таблице - PullRequest
1 голос
/ 19 октября 2011

У меня проблема с TSQL.У меня есть несколько таблиц, каждая таблица содержит разное количество полей с разными именами.

Мне нужно динамически взять все эти таблицы, прочитать все записи и преобразовать каждую запись в список строк, где каждое значение разделено запятыми.И делать что-л.с этой строкой.

Я думаю, что мне нужно использовать CURSORS, но я не могу выбрать их, не зная конкретного количества полей с именами и типами.Может быть, я могу создать табличную переменную с динамическим числом полей?

Большое спасибо!

Макаров Артем.

Ответы [ 3 ]

1 голос
/ 19 октября 2011

Я бы использовал один из многих скриптов T-SQL, написанных для генерации операторов INSERT.Они делают именно то, что вам нужно.А именно

  1. Обратный инжиниринг данной таблицы для определения имен и типов столбцов
  2. Создание строки значений с разделителями

Самый полный пример, который я нашелздесь здесь

Но простой поиск в Google для «INSERT STATEMENT GENERATOR» даст несколько примеров, которые вы можете использовать в соответствии со своими потребностями.

Удачи!

1 голос
/ 19 октября 2011

Возможно, с этим можно что-то сделать.

select T2.X.query('for $i in * 
                   return concat(data($i), ",")'
                 ).value('.', 'nvarchar(max)') as C
from (
      select *
      from YourTable
      for xml path('Row'),elements xsinil, type
     ) as T1(X)
  cross apply T1.X.nodes('/Row') T2(X)    

Это даст вам одну строку для каждой строки в YourTable с каждым значением в YourTable, разделенным запятой в столбце C.

Это создает XML для всей таблицы, а затем анализирует этот XML. Возможно, у вас возникнут проблемы, если у вас есть таблицы с большим количеством строк.

Кстати: я заметил из комментария, что вы можете "использовать только чистый SQL". Я действительно не думаю, что это квалифицируется как «чистый SQL»:).

1 голос
/ 19 октября 2011
SELECT 
   ORDINAL_POSITION
  ,COLUMN_NAME
  ,DATA_TYPE
  ,CHARACTER_MAXIMUM_LENGTH
  ,IS_NULLABLE
  ,COLUMN_DEFAULT
FROM   
  INFORMATION_SCHEMA.COLUMNS 
WHERE   
  TABLE_NAME = 'MYTABLE' 
ORDER BY 
  ORDINAL_POSITION ASC; 

от http://weblogs.sqlteam.com/joew/archive/2008/04/27/60574.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...