2015-12-29 4 views
0

J'essaie de créer une fonction de table CLR (C#) qui retourne une table de dates.Table CLR Fonction évaluée avec le type de retour de date SQL

[SqlFunction(
    DataAccess = DataAccessKind.Read, 
    FillRowMethodName = "FindDates_FillRow", 
    TableDefinition = "ReturnDate date")] 
public static IEnumerable BusinessDays(SqlDateTime startDate, SqlDateTime endDate) 
{ 
    //function body 
} 

public static void FindDates_FillRow(
object resultObj, 
out SqlDateTime returnDate) 
{ 
    dayResult result = (dayResult)resultObj; 
    returnDate = result.Date; 
} 

Les résultats de code ci-dessus dans une erreur, car le type de SqlDateTime crée une signature de méthode sur FillRow qui diffère de ce que SQL Server attend à ce que compte tenu de l'attribut TableDefinition.

SQL72014: .Net SqlClient Data Provider: Msg 6258, niveau 16, état 1, Procédure BusinessDays, ligne 1 signature de la fonction de la méthode "FillRow" (désigné par SqlFunctionAttribute.FillRowMethodName) ne SQL correspondance déclaration pour la table une valeur function'BusinessDays CLR due à la colonne 1.

Si je change le TableDefinition à un type datetime, tout fonctionne mais comme il n'y a pas de type de SqlDate, comment puis-je retourner un type de date? Est-ce possible ou dois-je simplement utiliser datetime du côté CLR et passer à une date dans ma requête SQL?

Répondre

1

Il n'y a pas de type SqlDate dans system.data.sqltypes et aucun autre type de données qui contiendrait uniquement une date. La façon de le faire est de passer un datetime et le convertir en SQL (si vous avez vraiment besoin de conversion en date).

+0

J'ai besoin d'un type de date car le cas d'utilisation principal de cette fonction sera de rejoindre la colonne de date des autres tables. Je marque cela comme la solution car ce que j'espérais ne semble pas possible et le casting est actuellement ma meilleure option. Je crois que d'une autre façon serait de créer une fonction encapsuleur SQL en ligne qui effectue l'opération de transtypage (de manière à éviter le redondance de code/casting sur chaque jointure). – phosplait

+0

Je ne pense pas qu'il y ait besoin de conversion si la valeur datetime est '00: 00: 00'. Vous avez besoin du casting à ce jour seulement si vous avez 'junk' à couper de votre date-heure. Sinon, ne faites pas le travail supplémentaire car sql le fera pour vous. –

-1

Une date/heure est une date dont la partie horaire est définie sur 00:00:00, non? Vous pouvez lancer le résultat à ce jour s'il a une importance.