2

Contexte:Comment puis-je utiliser le SqlFunctionAttribute dans un projet de base de données pour générer le SQL pour déployer les fonctions moi-même? Visual Studio ne

Visual Studio échoue à déployer un projet de base de données. Il essaie de supprimer les fonctions qui sont déjà référencées (par exemple, dans une contrainte de vérification), plutôt que d'ajouter les nouvelles et de mettre à jour celles qui existent déjà, de sorte que le déploiement échoue toujours. Par conséquent, j'écris mon propre code pour mettre à jour l'assemblage et ajouter/mettre à jour toutes les fonctions.

Je suppose que le compilateur/déployeur utilise la réflexion et les propriétés de l'attribut SqlFunction, donc j'utilise également la réflexion pour rassembler une liste MethodInfo des méthodes statiques qui ont l'attribut SqlFunction.

Question/Tâche:

je dois savoir comment traduire les propriétés de SqlFunctionAttribute (par exemple IsDeterministic, DataAccess, Nom, IsPrecise, etc.) et la signature de la méthode de la fonction dans un T-SQL approprié Instruction "CREATE FUNCTION".

Les informations existantes, je l'ai déjà trouvé ne pas être utile:

Le documentation pour « créer la fonction » est source de confusion et incomplète. Vers le bas, il mentionne finalement certaines des propriétés de SqlFunction comme IsDeterministic, mais il en parle comme s'il s'agissait de propriétés C#, pas de paramètres T-SQL, donc je n'ai aucune idée de comment les utiliser dans une instruction create function.

//CLR Functions 
CREATE FUNCTION [ schema_name. ] function_name 
({ @parameter_name [AS] [ type_schema_name. ] parameter_data_type 
     [ = default ] } 
    [ ,...n ] 
) 
RETURNS { return_data_type | TABLE <clr_table_type_definition> } 
    [ WITH <clr_function_option> [ ,...n ] ] 
    [ AS ] EXTERNAL NAME <method_specifier> 
[ ; ] 

j'attendre le paramètre clr_function_option pour gérer les choses comme IsDeterministic, mais ce n'est pas répertorié comme une option.

Pendant ce temps, dans la documentation pour IBM DB2, je vois des déclarations comme ce qui suit, que la documentation MSDN n'a rien de semblable:

CREATE FUNCTION countUp(INTEGER) 
    RETURNS INTEGER 
    LANGUAGE CLR 
    PARAMETER STYLE SQL 
    SCRATCHPAD 10 
    FINAL CALL 
    NO SQL 
    FENCED 
    THREADSAFE 
    NOT DETERMINISTIC 
    EXECUTION CONTORL SAFE 
    EXTERNAL NAME 'gwenUDF.dll:bizLogic.empOps!CountUp' ; 
+0

Vous devez copier l'assembly sur votre serveur SQL, puis utilisez le T-SQL approprié. Je peux montrer le SQL complet quand je reviens à mon PC dans quelques heures. – Portman

+0

Obtenir l'assemblage et le mettre à jour est assez facile. Il s'agit de mettre les fonctions en place et de les mettre à jour une fois qu'elles sont déjà référencées, ce qui est difficile. Visual Studio ne peut pas le gérer, car il essaie d'abandonner les fonctions et ne peut pas les utiliser car il est utilisé dans les contraintes de vérification. Ce dont j'ai vraiment besoin, c'est le code pour une fonction comme "string GetSQLForCreateFunction (MethodInfo m);", où la méthode a un attribut SqlFunction. – Triynko

Répondre

2

Je résolu ce problème par la suite, après avoir réalisé que SQL Server, possédant l'assemblage lui-même, a accès aux valeurs de propriété de SqlFunctionAttribute. Dans ce cas, il n'y a pas besoin (et ce n'est pas une syntaxe pour) de spécifier de telles propriétés dans l'instruction T-SQL "CREATE FUNCTION".

J'ai construit un utilitaire pour énumérer automatiquement et déployer des fonctions et l'enregistrement des contraintes qui fonctionne comme ceci:

  1. Il énumère toutes les méthodes statiques déployables dans les classes que je spécifie, en recherchant des fonctions ayant un attribut SqlFunction en utilisant la réflexion. Il exécute également une requête pour énumérer toutes les fonctions d'assemblage scalaire et table-existantes déjà déployées. Il fusionne ensuite ces listes en une seule liste, où chaque fonction existe ou n'existe pas. Il y a un bouton pour mettre à jour l'ensemble, et un bouton pour basculer l'existence de chaque fonction, rendant les fonctions d'ajout/suppression/mise à jour BREEZE.

  2. En outre, j'ai ajouté un deuxième onglet à l'interface pour créer/activer/vérifier/désactiver les contraintes de vérification. J'ai créé un nouvel attribut appelé SqlFunctionCheck, qui peut être appliqué plusieurs fois à une fonction. L'attribut a une propriété "Table" et une propriété "Champ", ce qui aide l'utilitaire à générer les contraintes de vérification.Il agrège tous les contrôles par table, crée une vérification pour chaque table nommée "CK_" + nom_table, et crée une expression de contrainte rejoignant tous les appels de méthode avec "et" passant le nom de champ associé à cette table à la fonction. Il affiche l'expression de contrainte générée ainsi que l'expression de contrainte interrogée depuis le serveur sql si la contrainte existe déjà.

OMI, c'est la solution ultime pour l'utilisation de SQL intégration CLR pour appliquer des contraintes de type de données en studio de gestion, des requêtes SQL dans votre code et les données utilisées à travers le code lui-même à partir d'une classes de données centralisées (contrainte) .

Interface Screenshots and Relevant Function Headers http://i41.tinypic.com/5ydrop.png