valor tabla stored retornar recorrer procedimientos procedimiento parametros devolver declarar datos arreglo array almacenados almacenado .net sql-server-2005 stored-procedures

.net - tabla - ¿Puedo devolver un varchar(max) de un procedimiento almacenado?



recorrer array sql server (10)

¿Cómo se ve esta cadena grande? ¿Es quizás algo que podría devolverse mejor a través de un conjunto de registros adicional, o es solo texto de notas?

Sistema web VB.net con un servidor SQL Server 2005. Tengo un procedimiento almacenado que devuelve un varchar, y finalmente estamos obteniendo valores que no caben en un varchar (8000).

Cambié el parámetro de devolución a varchar (max), pero ¿cómo le digo a la propiedad OleDbParameter.Size que acepte cualquier cantidad de texto?

Como ejemplo concreto, el código VB que obtuvo el parámetro de retorno del procedimiento almacenado solía ser:

objOutParam1 = objCommand.Parameters.Add("@RStr", OleDbType.varchar) objOutParam1.Size = 8000 objOutParam1.Direction = ParameterDirection.Output

¿Qué puedo hacer. Size para trabajar con a (max)?

Actualizar:

Para responder algunas preguntas:

Para todos los efectos, este texto debe aparecer como un solo fragmento. (Cambiar eso requeriría más trabajo estructural de lo que quiero hacer, o de lo que estoy autorizado, en realidad).

Si no configuro un tamaño, aparece un error que dice "Cadena [6]: la propiedad Tamaño tiene un tamaño no válido de 0".


¿Has intentado no especificar el tamaño?
¿Podría devolver un TEXTO en lugar de un VARCHAR (MAX)?


¿Puedes usar ADO.NET?

Editar: para aclarar, solo sugiero que desee considerar ADO.NET ya que está trabajando con VB.NET 2005 y SQL Server 2005: OLEDB era la forma de acceder a las bases de datos pre.NET, por lo que puede encontrar más flexibilidad mediante el uso de ADO.NET en su lugar.

No debe devolver VARCHAR de un procedimiento almacenado. Ni siquiera estoy seguro de que puedas.

Sin embargo, si usa un parámetro OUT, no debería tener que especificarlo por tamaño. Por ejemplo:

SqlParameter p = new SqlParameter("@RStr", SqlDbType.VarChar); p.Direction = ParameterDirection.Output;

No estoy seguro de si esto se adaptará a sus necesidades, pero debería funcionar bien.


Has intentado especificar:

objOutParam1.Size = Int32.MaxValue;


La respuesta corta es usar TEXTO en lugar de VARCHAR (max). 8K es el tamaño máximo de una página de base de datos, donde todas sus columnas de datos deberían coincidir, excepto BLOB y TEXT. Es decir, su capacidad disponible es inferior a 8 k debido a sus otras columnas.

BLOB y TEXT es tan web 1.0. Las filas más grandes significan un mayor tiempo de replicación de la base de datos y una mayor E / S de archivos. Sugiero que mantenga un servidor de archivos por separado con una interfaz HTTP para eso.

Y, para la columna anterior

DataUrl VARCHAR (255) NOT NULL,

Al insertar una nueva fila, primero calcule la suma de comprobación MD5 de los datos. En segundo lugar, cargue los datos en el servidor de archivos con la suma de comprobación como nombre de archivo. En tercer lugar, INSERT INTO ... (..., DataUrl) VALUES (..., " http: // fileserver / get? Id = ". Md5_checksum_data)

Con este diseño, su base de datos se mantendrá en calma incluso si el tamaño de datos promedio es de 1000x.


Upvoted Ed Altofer. (Él respondió primero, así que si te gusta mi respuesta, también la vota).

OleDb es tu problema. Es una conexión de base de datos genérica que necesita hablar más allá de SQL Server y, como resultado, tiene una situación de denominador común mínimo donde solo se admite completamente el conjunto de características compuestas más débiles. Una de las características perdidas es el soporte varchar (max).

Está utilizando SQL Server 2005 y VB.Net. ¿Qué le impide usar System.Data.SqlClient en lugar de System.Data.OleDb?

Editar
Encontré la documentación sobre el problema. Mira aquí:
http://msdn.microsoft.com/en-us/library/ms131035.aspx

La porción relevante:

Los valores devueltos del tipo de datos varchar (max), nvarchar (max), varbinary (max), xml, udt u otros tipos de objetos grandes no pueden devolverse a versiones de cliente anteriores a SQL Server 2005. Si desea utilizar estos tipos como devolver valores, debe usar SQL Server Native Client.


Creo que usar -1 para el tamaño funcionaría. Al menos debería con ADO.NET. Me gusta esto:

objOutParam1 = objCommand.Parameters.Add ("@ RStr", OleDbType.varchar, -1)

Este es un artículo extenso, pero muestra el uso de -1 en el último ejemplo:

http://msdn.microsoft.com/en-us/library/bb399384.aspx


Ha intentado con " OleDbType.LongVarChar ", este tipo se asigna a Texto en el servidor SQL 2K y le permite recuperar más de 8K caracteres.


Simplemente use int.MaxValue para el tamaño del parámetro. El byte [] fuera del sproc tendrá la longitud correcta. (Estoy usando activamente varbinary pero los resultados serán los mismos).

param.Size = int.MaxValue; param.SqlDbType = SqlDbType.VarBinary;


La opción -1 funciona bastante bien. Lo uso en varios casos en los que tengo un retorno varchar (máximo) desde un proceso almacenado.