SqlFunction ne parvient pas à ouvrir la connection au context malgré la présence de DataAccessKind.Read

J'ai un projet SqlServer avec un test très simple pour une fonction Table-Valued: –

[SqlFunction(TableDefinition = "forename nvarchar(50)", FillRowMethodName = "TestFillRow", DataAccess = DataAccessKind.Read)] public static IEnumerable TestConn(int ID) { using (SqlConnection con = new SqlConnection("context connection=true")) { //con.Open(); yield return "Anthony"; } } public static void TestFillRow(object obj, out ssortingng forename) { forename = (ssortingng)obj; } 

Notez que l'ouverture sur la connection est actuellement commentée. Une fois déployé, je peux exécuter comme ça en SQL: –

 SELECT * FROM [dbo].[TestConn](1) 

Tout fonctionne bien.

Maintenant, je décommenter le con.open() et il échoue avec: –

L'access aux données n'est pas autorisé dans ce context. Soit le context est une fonction ou une méthode non marquée avec DataAccessKind.Read ou SystemDataAccessKind.Read, est un callback pour get des données à partir de la méthode FillRow d'une fonction de valeur table, ou est une méthode de validation UDT.

Je ne vois pas quel est le problème, la fonction TestConn a DataAccessKind.Read .

Quelqu'un sait-il d'autres raisons pour get cette erreur?

Le problème est le suivant:

  1. SQLCLR n'autorise aucun access aux données dans TestFillRow

  2. Même s'il "semble" que votre TestFillRow n'accède pas aux données, la façon dont le compilateur traduit le code avec des instructions "yield" consiste à en différer l'exécution jusqu'à l'appel du premier .MoveNext () à l'iterator. Par conséquent, la déclaration suivante:

     using (SqlConnection con = new SqlConnection("context connection=true")) 

    est exécuté dans TestFillRow … ce qui est illégal.

Ne pas utiliser le rendement du rendement ; Au lieu de cela, chargez le résultat entier dans une List<> et renvoyez la list à la fin de la fonction UD.

"SQLCLR n'autorise aucun access aux données dans TestFillRow" est une erreur.

Si vous n'utilisez pas context connection = true connetion ssortingng, vous pouvez accéder aux données à l'intérieur de la méthode FillRow .