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!
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:
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.[SqlProcedure()]
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.
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.
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.