web-dev-qa-db-fra.com

Comment imprimer un message de la fonction SQL CLR?

Y a-t-il un équivalent de

PRINT 'hello world'

qui peut être appelé du code CLR (C #)?

J'essaie de générer des informations de débogage dans ma fonction. Je ne peux pas exécuter le débogueur vs car il s'agit d'un serveur distant.

Merci!

35
Serguei

La réponse est que vous ne pouvez pas faire l'équivalent de

PRINT 'Hello World'

de l'intérieur a [SqlFunction()]. Vous pouvez le faire à partir d'une [SqlProcedure()] utiliser

SqlContext.Pipe.Send("hello world")

Ceci est cohérent avec T-SQL, où vous obtiendrez l'erreur "Utilisation non valide d'un opérateur d'exécution latéral" Imprimer "dans une fonction" si vous collez une impression à l'intérieur d'une fonction. Mais pas si vous le faites d'une procédure stockée.

Pour les solutions de contournement, je suggère:

  1. Utilisez Debug.print à partir de votre code et joignez un débogueur au serveur SQL (je sais que cela ne fonctionne pas pour vous comme vous l'avez expliqué).
  2. Enregistrez les messages dans une variable globale, par exemple List<string> messages, Et écrivez une autre fonction de valorisation de la table qui renvoie le contenu de messages. Bien sûr, l'accès à messages doit être synchronisé car plusieurs threads pourraient essayer d'y accéder en même temps.
  3. Déplacez votre code sur un [SqlProcedure()]
  4. Ajouter un paramètre 'Débogou' que lorsque = 1 La fonction renvoie les messages dans le cadre de la table renvoyée (en supposant qu'il y a une colonne avec du texte ..)
33
Nestor

Vous devriez juste être capable de faire:

SqlContext.Pipe.Send("hello world");

Si vous exécutez cela dans un CLR UDF, SqlContext.Pipe sera toujours null comme vous l'avez découvert. Sans un SqlPipe je ne crois pas que vous puissiez faire ce que vous voulez.

Si cela est purement à des fins de débogage, vous pouvez toujours ouvrir un fichier dans le code géré et écrire votre sortie là-bas. Cela nécessite que votre assemblée ait EXTERNAL_ACCESS Autorisation, cependant, et cela nécessite à son tour que la base de données soit marquée comme digne de confiance. Pas nécessairement quelque chose que je ferais ou recommanderais.

10
Sean Bright

Ahh je vois ... Jsut pour clarifier: si vous avez un sqlfunction alors sqlcontext.pipe n'est pas disponible, cependant dans une sqlproceduture C'est et vous pouvez utiliser Envoyer () écrire des messages.

Je n'ai toujours pas trouvé de moyen de générer des informations à partir d'une SQLFConction de côté à partir d'un message d'exception.

2
Serguei

Vous pouvez essayer de mettre ces informations via la procédure stockée "xp_logevent". Vous pouvez définir vos informations de débogage comme des "informations", "Avertissement" ou "Erreur" au niveau différent. J'ai également essayé de mettre ces informations de débogage/d'erreur dans le journal des événements, mais qui nécessitent une configuration de peu de bit à la sécurité, ce que je doute que je ne puisse pas utiliser cela à la production.

1
barsteng