1
votes

Remplacer le texte de la définition VIEW

J'ai la définition VIEW suivante:

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'

Scénario 1: Je souhaite supprimer (ou remplacer par une chaîne vide) la table t1 instruction select.

La vue doit ressembler à:

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'  

Scénario 2: Vous voulez supprimer l'instruction select de la table t4 . p>

La vue doit ressembler à:

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'

Remarque : en fonction de l'exigence, vous pouvez supprimer toute instruction de sélection de la définition VIEW. / p>


3 commentaires

Quel est l'intérêt de changer la définition? Vos applications clientes recevront des résultats imprévisibles car elles ne sauraient pas quelles données retournent exactement. Créez plusieurs vues différentes ou ajoutez une colonne d'indicateur à votre colonne actuelle, puis filtrez les données dont vous avez besoin du côté client.


Copie possible de Actualiser la vue après la suppression du tableau


Ceci est juste un kludge à votre question précédente. Ce qui semble être un kludge à vos problèmes de schéma.


3 Réponses :


0
votes

Le serveur SQL vous permet d'utiliser l'expression régulière comme modèle de recherche dans l'éditeur, il vous suffit donc de:

  1. Appuyez sur Ctrl + F

  2. Activer l'utilisation d'expressions régulières

  3. Comme modèle de recherche, utilisez select. + from t1 (. * \ n) +? select , où t1 peut être remplacé par n'importe quel nom de table

  4. Comme modèle de remplacement, utilisez select

Voir l'écran ci-dessous (après remplacement):

 entrez la description de l'image ici


1 commentaires

@MAK Non, le serveur SQL ne prend pas en charge ces expressions régulières avancées dans les requêtes.



3
votes

Au lieu de vue, créez une fonction de table en ligne également appelée vue avec paramètres. Par exemple:

SELECT *
FROM T1 A
INNER JOIN V_1(1, 0, 0, 1) B
   ON ....

Vous pouvez utiliser la fonction dans des jointures comme view, mais vous pouvez transmettre les données à renvoyer. Par exemple:

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
)


0 commentaires

0
votes

J'aime la réponse de @gotqn mais, si cela doit être une vue, je ferais ceci:

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;

Ce qui est bien ici, c'est que l'optimiseur est suffisamment intelligent pour ignorer et éviter complètement touchant les tables avec des données non incluses dans l'ensemble de résultats final.

Notez ces requêtes et les plans d'exécution:

--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

 entrez la description de l'image ici


0 commentaires