If instruction pour déterminer quel SELECT doit returnner dans la fonction Table-Valued

En raison d'une modification récente des règles métier, un certain set de données était stocké dans une database et stocké dans une database différente sur le même server. Comme les choses sont actuellement configurées, si un user veut interroger des données à partir d'une plage de dates qui chevauchent l'heure à laquelle les règles métier ont été modifiées, il est obligé d'utiliser une instruction IF dans son code.

Je voudrais créer une fonction de table qui résumera ce changement dans les règles de gestion pour les users qui font une telle requête. Actuellement j'essaye d'exécuter du code semblable à ceci:

CREATE FUNCTION dbo.someFunction (date DATETIME) RETURNS TABLE AS RETURN IF (date <= business_rules_change_date) BEGIN SELECT (A select statement) FROM (Old Database) WHERE (criteria) END ELSE SELECT (A similar select statement) FROM (New Database) JOIN (A Join Statement) WHERE (criteria) GO 

et on me dit qu'il y a une erreur de syntaxe autour de l'instruction IF. Y a-t-il une bonne solution à mon problème?

Ou comme Yuriy vous a suggéré de faire appel à des fonctions valorisées Multi-statement-table quelque chose comme ça …

 CREATE FUNCTION dbo.someFunction (date DATETIME) RETURNS @TABLE TABLE ( -- Define the structure of table here ) AS BEGIN IF (date <= business_rules_change_date) BEGIN INSERT INTO @TABLE SELECT (A select statement) FROM (Old Database) WHERE (criteria) END ELSE BEGIN INSERT INTO @TABLE SELECT (A similar select statement) FROM (New Database) JOIN (A Join Statement) WHERE (criteria) END RETURN END 

Vous pouvez essayer quelque chose comme ça

 CREATE FUNCTION dbo.someFunction (date DATETIME) RETURNS @RtnTable TABLE (SomeValue varchar(250)) AS BEGIN IF (date <= business_rules_change_date) BEGIN INSERT INTO @RtnTable SELECT (A select statement) FROM (Old Database) WHERE (criteria) END ELSE BEGIN INSERT INTO @RtnTable SELECT (A similar select statement) FROM (New Database) JOIN (A Join Statement) WHERE (criteria) END RETURN END 

Cet exemple suppose que votre fonction renvoie un resultset avec une seule colonne varchar. En fonction de votre condition IF, vous pouvez la remplir avec les résultats d'une instruction SELECT différente. Ajustez-le au besoin.

Les fonctions de table en ligne ne peuvent pas contenir d'instruction IF. Vous pouvez réorganiser votre requête de cette façon:

 CREATE FUNCTION dbo.someFunction (date DATETIME) RETURNS TABLE AS RETURN SELECT (A select statement) FROM (Old Database) WHERE (criteria) AND (date <= business_rules_change_date) UNION SELECT (A similar select statement) FROM (New Database) JOIN (A Join Statement) WHERE (criteria) AND (date > business_rules_change_date) GO