Динамическое количество полей в таблице

#tsql

#tsql

Вопрос:

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

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

Я думаю, что мне нужно использовать КУРСОРЫ, но я не могу ПОЛУЧИТЬ их, не зная конкретного количества полей с именами и типами. Может быть, я могу создать табличную переменную с динамическим количеством полей?

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

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

Ответ №1:

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

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

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

Но простой поиск в Google по запросу «ГЕНЕРАТОР ИНСТРУКЦИЙ ВСТАВКИ» даст несколько примеров, которые вы можете изменить в соответствии с вашими потребностями.

Удачи!

Ответ №2:

 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

Комментарии:

1. Я бы использовал объект в своем приложении для представления таблицы после получения результирующего набора из приведенного выше запроса. Если вы хотите сделать это на чистом SQL, я не знаю достаточно, чтобы ответить осмысленно.

2. К сожалению, я использую только чистый SQL. Спасибо!

Ответ №3:

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

 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. Ха! Спасибо 🙂 Но я даже не могу этого понять 🙂 Я уже это делаю.. Это было очень сложно 🙂