Вы можете легко построить extraction SQL
для каждого представления, используя представления управления системой. Этот простой запрос:
SELECT v.[name]
,c.[name]
,c.[column_id]
,c.[is_nullable]
FROM sys.views V
INNER JOIN sys.columns C
ON V.[object_id] = C.[object_id];
вернет все необходимое для выполнения задачи:
- имя вида
- имя столбца
- порядок столбцов
- если столбец обнуляемый
Итак, нам нужно только построить операторы извлечения SQL:
SELECT v.[name]
,'SELECT ' + DS.[definition] + ' FROM ' + v.[name]
FROM sys.views V
CROSS APPLY
(
SELECT STUFF
(
(
SELECT ',' + CASE WHEN c.[is_nullable] = 1 THEN 'ISNULL(' + c.[name] + ','''')' ELSE c.[name] END
FROM sys.columns C
WHERE V.[object_id] = C.[object_id]
ORDER BY c.[column_id]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
)
) DS ([definition]);
В зависимости от версии SQL вы можете уменьшить приведенный выше код - например, используя IIF или STRING_AGG .
Кроме того, вы можете добавить предложение WHERE
, чтобы отфильтровать запрос для определенных представлений.