2009-07-15 7 views
14

solito mi definisco dimensioni quando si dichiara parametri nel mio SP, come:Qual è l'effetto delle dimensioni omettere nella dichiarazione nvarchar

@myParam nvarchar(size) 

o quando la fusione o la conversione:

CAST(@myParam AS nvarchar(size)) 

Recentemente ho' ve dimensioni rimosso dalle mie funzioni CAST come:

CAST(@myParam AS nvarchar) 

e sono po 'preoccupato se questo sta per venire e mi ha morso quando LEA t previsto :-(, poiché ho notato il troncamento su variabili nvarchar quando si utilizza CTE ricorsivo e si esegue il cast di nvarchar senza specificare le dimensioni.

Eventuali commenti?

risposta

18

Se si omette la dimensione, il valore predefinito è 30. Vedi questo:

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

Per vedere in azione, provare eseguendo le seguenti dichiarazioni:

--outputs: 123456789.098765432 
select cast (123456789.098765432 as nvarchar) 

--throws "Arithmetic overflow error converting expression to data type nvarchar." 
select cast (123456789.0987654321 as nvarchar) 

--outputs: 123456789.0987654321 
select cast (123456789.0987654321 as nvarchar(31)) 

Per @ di Krul commento ; 30 è la lunghezza predefinita per CAST; tuttavia la lunghezza predefinita per una definizione di dati o una dichiarazione variabile è 1.

NB: C'è anche una funzione STR che converte campi numerici in stringhe, per cui la lunghezza predefinita è 10.

--outputs: 1234567890 
select str(1234567890) 

--outputs: ********** 
select str(12345678901) 

--outputs: 12345678901 
select str(12345678901,11) 
+0

grazie, puoi fornire qualche link? – krul

+6

grazie mille, che chiarisce le cose: Quando n non è specificato in una definizione di dati o dichiarazione di dichiarazione di variabili, la lunghezza predefinita è 1. Quando n non è specificato con la funzione CAST, la lunghezza predefinita è 30. – krul

4

fisserà la dimensione alla dimensione predefinita e troncare il resto. Questo probabilmente arriverà a morderti, a meno che la dimensione predefinita non sia appropriata.

Evento poi, vorrei suggerire di specificare sempre la dimensione di mettere in chiaro ciò che si pensa la dimensione sarà, invece di avere la prossima persona che legge per il codice devono venire a SO di chiedere ciò che la dimensione predefinita di un nvarchar è;).

Problemi correlati