Funkcja została zdefiniowana w dość prosty sposób:
[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)] public static int GetDBCount() { using (SqlConnection conn = new SqlConnection("context connection=true")) { conn.Open(); SqlCommand cmd = new SqlCommand( "SELECT COUNT(*) AS 'NumberOfDatabases' FROM sys.databases", conn); return (int)cmd.ExecuteScalar(); } }
Niestety jej wykonanie kończyło się błędem:
This statement has attempted to access data whose access is restricted by the assembly.
No cóż. DataAccess = DataAccessKind.Read był wprawdzie zdefiniowany, ale moja funkcja próbowała czytać z danych systemowych. W takim przypadku trzeba dodać: SystemDataAccess = SystemDataAccessKind.Read
Cała funkcja wygląda więc teraz tak:
[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)] public static int GetDBCount() { using (SqlConnection conn = new SqlConnection("context connection=true")) { conn.Open(); SqlCommand cmd = new SqlCommand( "SELECT COUNT(*) AS 'NumberOfDatabases' FROM sys.databases", conn); return (int)cmd.ExecuteScalar(); } }
Pełną listę atrybutów dla SQL CLR można znaleźć tutaj
https://msdn.microsoft.com/pl-pl/en-en/library/ms131050
i jak widać, warto do niej zaglądać!