Pouvons-nous créer une VUE paramétrée dans SQL Server 2008.
Ou toute autre alternative à cela ?
Pouvons-nous créer une VUE paramétrée dans SQL Server 2008.
Ou toute autre alternative à cela ?
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.
Non, vous ne pouvez pas. Mais vous pouvez créer une fonction de table définie par l'utilisateur.
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
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.
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.