Supposons que vous ayez une procédure stockée et qu'elle prenne un paramètre facultatif. Vous souhaitez utiliser ce paramètre facultatif dans la requête SQL. En général, c'est ainsi que je l'ai vu faire:Une bonne façon de gérer 'facultatif' où les filtres clause clause dans SQL?
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND (@MyOptionalParam IS NULL OR t1.MyField = @MyOptionalParam)
Cela semble bien fonctionner, mais il provoque une grande quantité de lectures logiques si vous exécutez la requête avec STATISTIQUES IO. J'ai également essayé la variante suivante:
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND t1.MyField = CASE WHEN @MyOptionalParam IS NULL THEN t1.MyField ELSE @MyOptionalParam END
Et il donne le même nombre de lectures élevées. Si nous convertissons le SQL à une chaîne, puis appelez sp_executesql à ce sujet, les lectures sont presque nulles:
DECLARE @sql nvarchar(max)
SELECT @sql = 'SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = ''test'''
IF @MyOptionalParam IS NOT NULL
BEGIN
SELECT @sql = @sql + ' AND t1.MyField = @MyOptionalParam '
END
EXECUTE sp_ExecuteSQL @sql, N'@MyOptionalParam', @MyOptionalParam
Suis-je fou? Pourquoi les clauses facultatives sont-elles si difficiles à obtenir?
Mise à jour: Je demande essentiellement s'il existe un moyen de conserver la syntaxe standard dans une procédure stockée et d'obtenir des lectures logiques faibles, comme le fait la méthode sp_ExecuteSql. Il me semble complètement fou de construire une chaîne ... sans compter que cela rend plus difficile à maintenir, déboguer, visualiser ..
Nicholas, voir l'approche de l'union ci-dessous pour un moyen d'utiliser la syntaxe SQL standard sans SQL dynamique - Je serais très curieux de vous voir comment il fonctionne dans votre scénario ... – chadhoc
@Nicholas: Construire une requête comme une chaîne avant de l'exécuter est ** exactement ** ce que * dynamic * SQL est. C'est un problème mineur à déboguer - copier/coller, se débarrasser de la syntaxe de concaténation de chaîne. –