Funkcja została zdefiniowana w dość prosty sposób:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[SqlFunction(DataAccess = DataAccessKind.Read, <strong>SystemDataAccess = SystemDataAccessKind.Read</strong>)] 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ć!