объединить все взгляды на основе таблицы - PullRequest
0 голосов
/ 06 июня 2011

У меня есть таблица базы данных со списком представлений sql

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

SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_30
    UNION ALL
    SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_30n
    UNION ALL
    SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_60n
    UNION ALL
    SELECT     ALINE1, HOME, EMAIL, EXPIRE, EDATE7, type
    FROM         dbo.campaign_membership_today
    UNION ALL
    SELECT     ALINE1, BOOKNO, EMAIL, DEPART, DEP7, type
    FROM         dbo.depart_151days
    UNION ALL
    SELECT     ALINE1, BOOKNO, EMAIL, DEPART, DEP7, type
    FROM         dbo.depart_90Days

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Я думаю, вы спрашиваете, как получить табличный диск, представления которого являются частью запроса.Другими словами, если ваша таблица имеет следующие строки:

dbo.View1
dbo.View2
dbo.View3

Ваш запрос вернет объединение этих трех представлений;правильно?

Предостережение: я очень сомневаюсь в базовых реляционных структурах, которые требуют от вас этого.Лучшая модель данных, вероятно, сделает это ненужным.Но я предполагаю, что у вас нет возможности изменить модель, поэтому попробуйте следующее:

Предположим, что три перечисленных выше представления находятся в поле с именем "ViewName" в таблице с именем "ViewsToReturn".Создайте запрос, который сначала объединяет все представлений, а затем фильтрует его в соответствии с именами представлений в ViewsToReturn.Вот так:

SELECT * FROM
    (SELECT Field1, Field2, 'dbo.View1' AS ViewName FROM dbo.View1
    UNION
    SELECT Field1, Field2, 'dbo.View2' AS ViewName FROM dbo.View2
    UNION
    SELECT Field1, Field2, 'dbo.View3' AS ViewName FROM dbo.View3
    UNION
    SELECT Field1, Field2, 'dbo.View4' AS ViewName FROM dbo.View4) AllRecords
WHERE AllRecords.TableName IN
    SELECT ViewName FROM ViewsToReturn

Это решение не является ни элегантным, ни производительным, но должно помочь, если я правильно понимаю ваш вопрос.

Удачи!

0 голосов
/ 07 июня 2011

Здесь много главных предостережений.

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

Во-вторых, этот тип шаблона (хранение таблиц и столбцов в таблице для генерации SQL) является действительно плохим шаблоном. Есть много проблем с этим. Я не могу предложить альтернативные решения, не зная больше о вашем приложении / проблемном пространстве.

Тем не менее, ниже приведена упрощенная версия того, как это может работать в SQL Server 2005. Это не включает обработку ошибок и т. Д.

DECLARE @sql VARCHAR(MAX)  -- NVARCHAR if you use unicode characters in table names

SELECT
    @sql = dbo.Concatenated_Rows('SELECT col1, col2 FROM ' + MT.table_name + ' UNION ALL ')
FROM
    dbo.My_Table MT

-- Remove the extra UNION ALL
SELECT @sql = SUBSTRING(@sql, 1, LEN(@sql) - 11)

EXEC(@sql)

Функция Concatenated_Rows должна быть написана. В качестве альтернативы вы можете использовать курсор или даже FOR XML для создания объединенной строки. Вот ссылка , которая хорошо объясняет многие из возможных методов и хорошо их сравнивает.

Опять же, возможно, есть лучшие решения, чем этот путь, особенно если это больше, чем разовая задача.

...