2010-09-15 9 views
6

Tengo un procedimiento almacenado que toma una cadena de una matriz de identificadores delimitada por tuberías y las analiza. Quiero que esto suceda en una transacción, así que no quiero pasarlos de a uno por vez.¿Es una buena idea usar varchar (max) como un argumento de procedimiento almacenado?

Si utilizo varchar (max) para no limitar el tamaño del argumento pasado, ¿esto causará problemas? No veo el límite alcanzado, pero tampoco quiero adivinar ni poner un límite arbitrario en la cadena.

CREATE PROCEDURE myProc 
    @IDs varchar(max) 
AS 

BEGIN 
    ... 
END 
GO 

Respuesta

3

No hay mucho para eso. varchar(max) se comporta como cualquier varchar con menos de 8000 caracteres hasta que supera los 8000 caracteres. Debe haber poca o ninguna diferencia entre varchar(200) y varchar(max) si los datos reales son de menos de 8000 caracteres. Si espera entradas más pequeñas pero no puede descartar entradas más grandes, un varchar(max) es excelente.

2

No sé si podría causar problemas, pero yo prefiero pasar a qué cantidad de elementos múltiples arrays '' a sprocs utilizando XML. Deja más claro qué tipo de datos es y hay buenas herramientas SQL-XML para 'transformar' el XML en una pseudo-tabla con la que te puedes unir. Entonces, la traducción de delimitado por canal -> XML puede ocurrir fuera de la base de datos.

+0

si se trata de una simple lista de valores (no de varios valores) XML añade una gran cantidad de datos extra (todas las etiquetas) para transmitir. –

+0

He visto otras sugerencias sobre el uso de XML para este propósito, pero agregaré que usar 'varchar (MAX)' definitivamente no causará problemas en sí mismo. Todavía hay un límite 'arbitrario' (2147483647 caracteres según SQL Server Books Online [para SQL Server 2005]), pero es como @KM dice "prácticamente ilimitado". –

+0

Sí, estoy seguro de usar XML para una sola lista de valores. – Kenoyer130

0

Uso varchar (max) cuando no conozco el límite (eso es lo que está ahí). Siempre es bueno establecer las variables con una cierta longitud, pero si se desconoce esto es aceptable y no causará ningún problema, excepto que su base de datos crezca un poco más y las personas puedan engañar a una mayor cantidad de datos en

1

If estás en SQL Server 2008, luego usaría un parámetro valuado en la tabla. Si no, siempre prefiero usar el tamaño más pequeño posible, pero no veo por qué MAX causaría ningún problema como parámetro de procedimiento almacenado. Si desea que el parámetro tenga una longitud prácticamente ilimitada, elija MAX.

-1

TSQL no es un buen lenguaje de manipulación de cadenas, y en cuanto a rendimiento (¡y en cuanto al código!) Sería mejor que analizaras la cadena fuera de la base de datos, entonces +1 a n8wrl's answer. Sin embargo, intrínsecamente, no hay nada de malo en usar un varchar(max) para esto.

Aparte de usar XML como n8wrl sugirió, una Table Valued Parameter podría ser una buena opción si usted está utilizando SQL Server 2008.

+0

Quiero envolver el procesamiento en una transacción, por lo que significa que no quiero analizarlo fuera de la base de datos. – Kenoyer130

Cuestiones relacionadas