stored procedimientos procedimiento ejemplos ejemplo almacenados almacenado c# sql-server clr nvarchar

c# - procedimientos - ¿Cómo devolver un nvarchar(max) en un CLR UDF?



procedimientos almacenados sql ejemplos (2)

Asumiendo la siguiente definición:

/// <summary> /// Replaces each occurrence of sPattern in sInput with sReplace. This is done /// with the CLR: /// new RegEx(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace). /// The result of the replacement is the return value. /// </summary> [SqlFunction(IsDeterministic = true)] public static SqlString FRegexReplace(string sInput, string sPattern, string sReplace) { return new Regex(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace); }

Al pasar en un valor de nvarchar(max) para sInput con una longitud> 4000 se truncará el valor (es decir, el resultado de llamar a este UDF es nvarchar(4000) en oposición a nvarchar(max) .


Oh, lo que sea, encontré la respuesta yo mismo:

/// <summary> /// Replaces each occurrence of sPattern in sInput with sReplace. This is done /// with the CLR: /// new RegEx(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace). /// The result of the replacement is the return value. /// </summary> [SqlFunction(IsDeterministic = true)] [return: SqlFacet(MaxSize = -1)] public static SqlString FRegexReplace([SqlFacet(MaxSize = -1)]string sInput, string sPattern, string sReplace) { return new Regex(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace); }

La idea es indicarle a SQL Server que los valores de entrada y retorno no son el nvarchar(4000) predeterminado nvarchar(4000) , sino que tienen un tamaño diferente.

Aprendí un truco nuevo con respecto a los atributos: se pueden agregar a los parámetros, así como al método en sí (bastante obvio), pero también al valor de retorno con la sintaxis [return: AttributeName(Parameter=Value, ...)] .