2008-12-10 15 views
11

Suponiendo siguiente definición:¿Cómo devolver un nvarchar (max) en una UDF de CLR?

/// <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); 
} 

Pasando en un valor nvarchar(max) para sInput con una longitud> 4000 tendrá como resultado el valor que se trunca (es decir, el resultado de llamar a este UDF es nvarchar(4000) en contraposición a nvarchar(max)

Respuesta

24
.

Oh, lo que sea, he encontrado la respuesta a mí 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 hacer alusión a SQL Server que la entrada y los valores de retorno no son el valor predeterminado nvarchar(4000), pero tienen un tamaño diferente.

he aprendido un nuevo truco con respecto a los atributos: Se pueden añadir a los parámetros, así como el método mismo (bastante obvio), pero también que el valor de retorno con el [return: AttributeName(Parameter=Value, ...)] Sintaxis.

+0

usted es una estrella, señor :) –

+0

Ese mecanismo se describe explícitamente en la referencia que cité, la respuesta que votó negativamente. – bielawski

Cuestiones relacionadas