Заменить текст из определения VIEW - PullRequest
1 голос
/ 22 мая 2019

У меня есть следующее VIEW определение:

create view v_1
as
select * from t1
where [date] between '2010-01-01' and '2019-01-01'
union all
select * from t2
where [date] between '2012-01-01' and '2019-01-01'
union all
select * from t3
where [date] between '2013-01-01' and '2019-01-01'
union all
select * from t4
where [date] between '2014-01-01' and '2019-01-01'

Сценарий 1: хотите удалить (или заменить на пустую строку) table t1 оператор выбора.

Вид должен выглядеть следующим образом:

create view v_1
as
select * from t2
where [date] between '2012-01-01' and '2019-01-01'
union all
select * from t3
where [date] between '2013-01-01' and '2019-01-01'
union all
select * from t4
where [date] between '2014-01-01' and '2019-01-01'  

Сценарий 2: хотите удалить table t4 оператор выбора.

Вид должен выглядеть следующим образом:

create view v_1
as
select * from t1
where [date] between '2010-01-01' and '2019-01-01'
union all
select * from t2
where [date] between '2012-01-01' and '2019-01-01'
union all
select * from t3
where [date] between '2013-01-01' and '2019-01-01'

Примечание : В зависимости от требования может потребоваться удалить любой оператор выбора из определения VIEW.

Ответы [ 3 ]

3 голосов
/ 22 мая 2019

Вместо представления создайте встроенную табличную функцию, также известную как представление с параметрами. Например:

create function v_1
(   
    @HasQuery1 BIT
   ,@HasQuery2 BIT
   ,@HasQuery3 BIT
   ,@HasQuery4 BIT
)
RETURNS TABLE
as
RETURN
(
select * from t1
where [date] between '2010-01-01' and '2019-01-01'
    AND @HasQuery1  = 1
union all
select * from t2
where [date] between '2012-01-01' and '2019-01-01'
    AND  @HasQuery2  = 1
union all
select * from t3
where [date] between '2013-01-01' and '2019-01-01'
    AND  @HasQuery3  = 1
union all
select * from t4
where [date] between '2014-01-01' and '2019-01-01'
    AND  @HasQuery4  = 1
)

Вы можете использовать функцию в соединениях, таких как просмотр, но вы можете передать, какие данные должны быть возвращены. Например:

SELECT *
FROM T1 A
INNER JOIN V_1(1, 0, 0, 1) B
   ON ....
0 голосов
/ 22 мая 2019

Мне нравится ответ @gotqn, но, если это будет представление, я бы сделал это:

--Sample Tables:
CREATE TABLE dbo.t1(id INT IDENTITY PRIMARY KEY, col1 INT);
CREATE TABLE dbo.t2(id INT IDENTITY PRIMARY KEY, col1 INT);
CREATE TABLE dbo.t3(id INT IDENTITY PRIMARY KEY, col1 INT);
CREATE TABLE dbo.t4(id INT IDENTITY PRIMARY KEY, col1 INT);

INSERT dbo.t1(col1) VALUES (10),(20),(30);
INSERT dbo.t2(col1) VALUES (60),(620),(630);
INSERT dbo.t3(col1) VALUES (0);
INSERT dbo.t4(col1) VALUES (0);
GO

--Solution
CREATE VIEW dbo.yourView AS
  SELECT t.*,show = 1 FROM dbo.t1 AS t UNION ALL
  SELECT t.*,show = 2 FROM dbo.t2 AS t UNION ALL
  SELECT t.*,show = 3 FROM dbo.t3 AS t UNION ALL
  SELECT t.*,show = 4 FROM dbo.t4 AS t
GO

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

Обратите внимание на эти запросы и планы выполнения:

SELECT v.* FROM dbo.yourView AS v;
SELECT v.* FROM dbo.yourView AS v WHERE v.show = 1;
SELECT v.* FROM dbo.yourView AS v WHERE v.show IN (1,3);
SELECT v.* FROM dbo.yourView AS v WHERE v.show <> 1;

enter image description here

0 голосов
/ 22 мая 2019

SQL-сервер позволяет использовать регулярные выражения в качестве шаблона поиска в редакторе, поэтому все, что вам нужно сделать, это:

  1. Нажмите Ctrl + F

  2. Разрешить использование регулярных выражений

  3. В качестве шаблона поиска используйте select.+from t1(.*\n)+?select, где t1 можно заменить любым именем таблицы

  4. Asзаменить шаблон использовать select

См. экран ниже (после замены):

enter image description here

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