2010-09-15 1 views
6

Ho una stored procedure che accetta una stringa di un array delimitato da pipe e li analizza. Voglio che questo accada in una transazione, quindi non voglio passarli uno alla volta.È consigliabile utilizzare varchar (max) come argomento stored procedure?

Se utilizzo varchar (max) per non limitare la dimensione dell'argomento passato, causerà problemi? Non vedo il limite raggiunto, ma non voglio nemmeno indovinare o posizionare un limite arbitrario sulla stringa.

CREATE PROCEDURE myProc 
    @IDs varchar(max) 
AS 

BEGIN 
    ... 
END 
GO 

risposta

3

Non c'è molto da fare. varchar(max) si comporta come qualsiasi varchar meno di 8000 caratteri fino a superare gli 8000 caratteri. Ci dovrebbe essere poca o nessuna differenza tra varchar(200) e varchar(max) se i dati effettivi sono meno di 8000 caratteri. Se ti stai aspettando input più piccoli ma non puoi escludere input più grandi, un varchar(max) è ottimo.

2

Non so se sarebbe causare problemi, ma preferisco passare quello che ammontano a multi-elemento 'allineamenti' a sprocs utilizzando XML. Rende più chiaro di che tipo di dati si tratta e ci sono dei buoni strumenti SQL-XML per "trasformare" l'XML in uno pseudo-tavolo a cui ci si può aggregare. Quindi, la traduzione da delimitata da pipe -> XML può avvenire al di fuori del DB.

+0

se si tratta di un semplice elenco di valori (non più valori) XML aggiunge un sacco di dati aggiuntivi (tutti i tag) da trasmettere. –

+0

Ho visto altri suggerimenti sull'utilizzo di XML esattamente per questo scopo, ma aggiungerò che l'utilizzo di 'varchar (MAX)' sicuramente non causerà problemi in-and-of-itself. Esiste ancora un limite "arbitrario" (2147483647 caratteri in base alla documentazione in linea di SQL Server [per SQL Server 2005]), ma è come @KM dice "praticamente illimitato". –

+0

Sì, sono molto interessato all'uso di XML per un singolo elenco di valori. – Kenoyer130

0

Io uso varchar (max) quando non conosco il limite (questo è ciò che è lì per). Sempre buono per impostare le variabili con una certa lunghezza, ma se sconosciuto è accettabile e non causerà alcun problema, ad eccezione del fatto che il database crescerà un po 'più grande e le persone in grado di duplicare una maggiore quantità di dati in

1

Se sei su SQL Server 2008, quindi utilizzerei un parametro con valori di tabella. In caso contrario, preferisco sempre usare la dimensione più piccola possibile, ma non vedo perché MAX possa causare problemi come parametro della stored procedure. Se vuoi che il parametro sia praticamente illimitato di lunghezza vai su MAX.

-1

TSQL non è un buon linguaggio di manipolazione delle stringhe e, dal punto di vista delle prestazioni (e del codice!), È meglio analizzare la stringa all'esterno del DB, quindi da +1 a n8wrl's answer. Tuttavia, intrinsecamente, non c'è niente di sbagliato nell'usare uno varchar(max) per questo.

Oltre a utilizzare XML come n8wrl suggerito, un Table Valued Parameter potrebbe essere una buona opzione se si sta utilizzando SQL Server 2008.

+0

Voglio racchiudere l'elaborazione in una transazione, quindi ciò significa che non voglio analizzarlo al di fuori del DB. – Kenoyer130