Primer intento de integración CLR, para poder usar las herramientas Regex.

Creo el ensamblaje:

CREATE ASSEMBLY SQLRegexTools
  FROM 'D:\CODE\SQLRegexTools\SQLRegexTools\bin\Release\SQLRegexTools.dll'

Esto se realiza correctamente y el ensamblado aparece en SELECT @ FROM sys.assemblies.

Pero no hay registros devueltos a SELECT * FROM sys.Assembly_modules.

Y cuando trato de CREAR FUNCIÓN para llamar a uno de los métodos,

CREATE FUNCTION RegExMatch(@pattern varchar(max)
                            , @SearchIn varchar(max)
                            , @options int)
RETURNS varchar
 EXTERNAL NAME SQLRegexTools.Functions.RegExMatch

Recibo un error 'Msg 6505, No se pudo encontrar el tipo "Funciones" en el ensamblaje' SQLRegexTools '.

El nombre de clase del módulo VB es "Funciones". ¿Por qué se denomina tipo en el error y por qué es posible que no vea nada en los módulos?

2
user212421 5 jul. 2017 a las 23:44

2 respuestas

La mejor respuesta

Este error se produce cuando SQL Server no puede resolver el nombre proporcionado. Pruebe el fragmento a continuación para ver si esto resuelve el problema.

CREATE FUNCTION RegExMatch(@pattern varchar(max)
                            , @SearchIn varchar(max)
                            , @options int)
RETURNS varchar
AS EXTERNAL NAME SQLRegexTools.[Functions].RegExMatch

La resolución de funciones / métodos individuales para acceder al código nativo es relativamente indistinguible de un nombre de objeto de varias partes (por ejemplo, un tipo).

Una nota adicional es que el código nativo que utiliza espacios de nombres anidados debe calificar completamente los espacios de nombres anidados dentro del mismo par de comillas. Por ejemplo, si RegExMatch estuviera ubicado en SQLRegexTools.A.B.C.RegExMatch, haría referencia a esto como SQLRegexTools.[A.B.C].RegExMatch cuando lo use con EXTERNAL NAME en SQL Server.

1
Joey 6 jul. 2017 a las 00:34

Esa es la respuesta Joey. Gracias.

Hay varias trampas en este proceso que aprendí después de mucha investigación y pruebas. A menudo están enterrados en publicaciones largas sobre todo el proceso, lo resumiré aquí:

  • Como explicó Joey, se necesita el nombre completo. Para ser más completo ...

Ejemplo:

             1                 2                   3               4

[SQLRegexToolsASM]. [SQLRegexToolsNS.RegexFunctionsClass] .RegExMatch

  1. Este es el nombre del ensamblado en el paso CREAR MONTAJE.
  2. Este es el espacio de nombres raíz de las propiedades del proyecto de ensamblaje. Si declaró uno o dos espacios de nombres, deben incluirse en el orden correcto, después de este elemento y antes del elemento 3 de esta lista. Observe que todos estos espacios de nombres están encerrados entre sus propios corchetes.

Ensamblaje. [rootnamespace.namespace.namespace] .classname.methodname "

  1. Este es el nombre de clase que asignó a la clase, tal vez así

    Clase pública RegexFunctionsClass

  2. El nombre del método definido en su ensamblado VB o C #.

0
user212421 10 jul. 2017 a las 15:45