c# - Cómo ejecutar SQLCLR UDF agregado directamente a SSDT sqlproj y resolver el error de referencia SQL71501
sql-server-2008-r2 (1)
He estado tratando de encontrar la respuesta a esta simple pregunta, pero hasta ahora no pude resolverlo.
Digamos que tengo MyDb.sqlproj, con varios contenidos sql (sprocs, views, trigger, etc.).
He agregado una nueva UDF a través de Agregar-> Nuevo elemento -> SQL CLR C #, Función definida por el usuario.
Por ejemplo:
namespace MyNameSpace
{
public class MyClass
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
//I use different attributes here, but it doesn''t matter
public static int Method1()
{
return 0;
}
}
}
En MyDb.sqlproj Properties, la pestaña SQLCLR MyDb es el nombre del ensamblado y espacio de nombres predeterminado
En mi código sql llamo al método clr usando NOMBRE EXTERNO :
CREATE PROCEDURE ClrMethod1
RETURNS [int] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [MyDb].[MyNamespace.MyClass].[Method1]
Parece que intenté todo para obtener la última línea para compilar. No puede resolver la referencia y obtener:
SQL71501: Función: [nombre de mi función sql] tiene una referencia no resuelta a Assembly [MyDb]
Por favor, indícame el camino correcto para que funcione. ¿Qué podría estar perdiendo?
Estoy usando VS2010 SP1 y la última versión de SSDT
Debe agregar su DLL compilada que contiene su código CLR como referencia. Por lo tanto, en su proyecto MyDb SSDT-> Referencias (haga clic con el botón derecho) -> Agregar referencia, busque la DLL.
Probablemente podría salirse con la referencia del proyecto en lugar de la DLL si tuviera el proyecto CLR (biblioteca de clases) en la misma solución, pero en mi caso estoy haciendo referencia a una DLL (compilada para una solución separada).
En cuanto al formato de la línea AS EXTERNAL NAME
:
AS EXTERNAL NAME [AssemblyName].[ClassName].[FunctionName]
Nota: Para los objetos CLR, elimino los espacios de nombres de alrededor de mis clases / código solo para simplificar las cosas, porque este paso suele ser el más problemático. Es fácil confundir AssmeblyName / DLL Name / Namespace. AssemblyName se encuentra en su proyecto de biblioteca de clases CLR accediendo a Propiedades del proyecto-> Aplicación -> "Nombre del ensamblado:". Quitaría cualquier espacio no alfanumérico de él solo para simplificar el nombre y descartarlo como un problema.
Entonces probaría eso, y una vez que lo haga funcionar, si realmente quiere espacios de nombres, puede agregar el espacio de nombres y descubrir la sintaxis a partir de ahí, y al menos usted sabe que las otras partes son correctas.
Está bien claro que tienes un archivo * .cs realmente dentro del mismo proyecto SSDT. entonces en ese caso si tu código es este:
Archivo CS:
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString SqlFunction1()
{
// Put your code here
return new SqlString (string.Empty);
}
}
Archivo SQL:
CREATE PROCEDURE ClrMethod1
RETURNS [int] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [MyDB].[UserDefinedFunctions].[SqlFunction1]
Esto compila para mí. Nota: Nuevamente no se usó el espacio de nombres. Cuando añadí Add New Item ... el código generado no incluía un espacio de nombre.