70 votes

Créer une vue paramétrée dans SQL Server 2008

Pouvons-nous créer une VUE paramétrée dans SQL Server 2008.

Ou toute autre alternative à cela ?

121voto

AdaTheDev Points 53358

Essayez de créer une fonction à valeur de table en ligne. Exemple:

CREATE FUNCTION dbo.fxnExample (@Paramètre1 INTEGER)
RETURNS TABLE
AS
RETURN
(
    SELECT Field1, Field2
    FROM SomeTable
    WHERE Field3 = @Paramètre1
)

-- Ensuite, appelez comme ceci, tout comme s'il s'agissait d'une table/vue avec un paramètre
SELECT * FROM dbo.fxnExample(1)

Si vous consultez le plan d'exécution pour la SELECT, vous ne verrez aucune mention de la fonction et vous montrera en fait simplement les tables sous-jacentes interrogées. C'est une bonne chose car cela signifie que les statistiques sur les tables sous-jacentes seront utilisées lors de la génération d'un plan d'exécution pour la requête.

La chose à éviter serait une fonction à valeurs de table à instructions multiples car les statistiques des tables sous-jacentes ne seront pas utilisées et peuvent entraîner de mauvaises performances en raison d'un mauvais plan d'exécution.
Exemple de ce qu'il faut éviter:

CREATE FUNCTION dbo.fxnExample (@Paramètre1 INTEGER)
RETURNS @Résultats TABLE(Field1 VARCHAR(10), Field2 VARCHAR(10))
AS
BEGIN
    INSERT @Résultats
    SELECT Field1, Field2
    FROM SomeTable
    WHERE Field3 = @Paramètre1

    RETURN
END

Légèrement différent, mais avec potentiellement de grandes différences de performance lorsque la fonction est utilisée dans une requête.

11voto

astander Points 83138

Non, vous ne pouvez pas. Mais vous pouvez créer une fonction de table définie par l'utilisateur.

5voto

heximal Points 5478

En fait, il existe un truc :

create view view_test as

select
  * 
from 
  table 
where id = (select convert(int, convert(binary(4), context_info)) from master.dbo.sysprocesses
where
spid = @@spid)

... dans la requête sql :

set context_info 2
select * from view_test

sera la même chose que

select * from table where id = 2

mais l'utilisation de udf est plus acceptable

2voto

davek Points 12514

Comme l'a mentionné un astander, vous pouvez le faire avec une UDF. Cependant, pour de grands ensembles en utilisant une fonction scalaire (par opposition à une fonction tableau en ligne), les performances seront médiocres car la fonction est évaluée ligne par ligne. En alternative, vous pourriez exposer les mêmes résultats via une procédure stockée exécutant une requête fixe avec des espaces réservés qui substitue vos valeurs de paramètre.

(Voici un article un peu daté mais toujours pertinent sur le traitement ligne par ligne pour les UDF scalaires.)

Édition: commentaires sur la dégradation des performances ajustés pour préciser que cela s'applique aux UDF scalaires.

0voto

Pankaj Agarwal Points 3807

Non. Vous pouvez utiliser UDF dans laquelle vous pouvez passer des paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X