Fonctions SQL et select *

Un comportement qu’il faut connaitre quand on utilise des fonctions SQL avec SQL Server. Les fonctions sont optimisées par le moteur et changer le schéma d’une table peut avoir des comportements surprenant.

Créer une table People et y ajouter quelques amis

Structure SQL - création

Créer un fonction simple

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION MyFunction(    ) 
RETURNS TABLE  
AS 
RETURN  
( 
        SELECT * from People 
) 
GO

Appeler la fonction et obtenir le résultat escompté

select * from dbo.MyFunction() 

SQL - résultat

Rajouter une colonne Superhero sur la table People et enrichir avec les informations

Structure SQL - modification

Rappeler la fonction et être surpris

Structure SQL - init

Solution :

Mettre à jour la fonction même si aucune modification effective n’est réalisée

USE [gla] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[MyFunction](    ) 
RETURNS TABLE  
AS 
RETURN  
( 
    SELECT * from People 
) 

Rappeler la fonction

SQL - résultat

Conclusion : S’il était encore besoin de le démontrer, le * c’est mal.

L’exemple servant d’illustration est simple mais enrobez cela avec de l’Entity Framework et dans un contexte où vous n’avez pas la main sur les évolutions SQL, cela devient bien plus sympathique.