2011-09-28 15 views
6

Tengo un problema que no puedo resolver. Estoy usando SQL Server 2005, C# CLR para usar dll externo. es un parámetro de longitud. Necesito usar como parámetro de función tipo varchar(max). Si en el código C# utilizo string, SqlSring, no puedo usar T-SQL tipo varchar(max), solo varchar(4000) de nvarchar(4000). Debo decir que puede ser situaciones, cuando necesito usar más de 4000 símbolos, entonces necesito saber qué tipo de C# necesito usar para varchar(max).T-SQL (varchar (max) vs CLR (cadena, SqlString, SqlChars)?

He leído muchos artículos, y varios de ellos dicen, que para esto puedo use SqlChars. Pero! Tengo manipulaciones con cadenas. ¿Cómo puedo tener acciones con string o SqlString y luego convertir a SqlChars? (Es posible SqlChars.ToString() o SqlChars.ToSqlString()).

No encontré ningún código C# para esto.

+0

Un 'varchar (max)' cadena que está utilizando su capacidad máxima no será que puede cargarse en una cadena de CLR, ya que agotará el espacio de direcciones. ¿Puede ser más explícito con respecto a las acciones que desea realizar frente a estas cadenas? –

+0

Convierto cualquier tipo de SQL a varchar y envío este valor a la dll externa. Entonces, haga manipulaciones con él y regrese a SQL Server. Ahora uso SQL/vchar (4000) y C#/string. Necesito más de 4000 símbolos. –

+0

@Damien_The_Unbeliever: tuve la impresión de que tanto el servidor 'varchar (max) 'de SQL Server como una instancia de .NET' string' podían tener hasta 2 GB de tamaño ... –

Respuesta

0

Probar usando la longitud -1. Algo como esto:

cmd.Parameters.Add("@param", SqlDbType.VarChar, -1).Value = "hdfiophdopigherog"; 
+0

No puedo probar esto, porque no tengo SqlCommand ... Solo parámetro de entrada - manipulación con su parámetro - out. Y necesito que los parámetros IN/OUT sean SqlChars –

+0

Si bien '-1' es técnicamente correcto, esta respuesta sigue siendo irrelevante para la pregunta. Esta respuesta se trata de una API SqlConnection y no de la API SQLCLR. –

4

Encontré la respuesta. No solo yo solo pregunté sobre esta pregunta. Tengo que leer las publicaciones más atentamente ...

Puede leer aquí http://social.msdn.microsoft.com/Forums/is/sqlnetfx/thread/391ebb98-e1b5-47fc-a72d-9f1e39829e3a El problema de la compatibilidad CLR resuelve no muy difícil.

Todo el tiempo que quería utilizar varchar(max) y trató de utilizar C# tipos string, SqlString, SqlChars. Necesita usar T-SQL nvarchar(max), y puede usar cualquiera de los tipos de C# string, SqlString, SqlChars!

Por supuesto nvarchar ocupando más espacio que varchar en dos ocasiones.

+0

SQLCLR no permite 'VARCHAR', ya sea 1 - 4000 o' MAX'. 'NVARCHAR' es el único tipo de cadena por el que pasa la API SQLCLR (bueno, supongo que' object'/'SQL_VARIANT' también puede pasar una cadena de hasta 4000). Si pasa valores 'VARCHAR', se convierten implícitamente a' NVARCHAR'. No use ni sugiera usar 'cadena' como un tipo de entrada o salida SQLCLR. Para obtener más información, consulte mi serie, [Stairway to SQLCLR] (http: //www.sqlservercentral.com/stairway/105855 /), en SQL Server Central (se requiere registro gratuito para ese sitio). –

11

Lo que hay que hacer es añadir SqlFacet (MaxSize = -1) atribuyen al parámetro:

[return: SqlFacet(MaxSize = -1)] 
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)] 
public static SqlString YourSqlFunction([SqlFacet(MaxSize = -1)]SqlString sourceSS) 
{ return new } 
+0

¡Correcto! ¡Esto hará que VS cree la secuencia de comandos correcta automáticamente! –

+1

Esta respuesta es correcta y debe marcarse como "aceptada". +1 –

Cuestiones relacionadas