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, ...)]
.
Consulte también ¿Cómo crear un procedimiento almacenado CLR con el parámetro Nvarchar (max)? donde descubrirá cómo / por qué debería usar el tipo de datos SqlChars. Ver https://msdn.microsoft.com/en-us/library/ms131065.aspx