2016-05-29 40 views
5

Ho un sito web relativamente semplice che usa php + mssql. Ho varie stored procedure che eseguono semplici operazioni di inserimento e cancellazione. Il problema che sto affrontando è che molti dei parametri che passo nella stored procedure hanno la stessa lunghezza della colonna in cui inserirò i dati.sql server stored procedure usa varchar max come parametro

Ad esempio, ho una stored procedure per registrare un utente. La stored procedure ha un parametro @USERNAME con varchar(12) come tipo. la colonna USERNAME nella tabella USER ha lo stesso tipo con quella lunghezza. In linea di principio questo non è davvero un problema. Ma preferirei poter modificare liberamente la lunghezza della colonna USERNAME senza dover modificare anche la lunghezza del parametro della stored procedure.

Non riesco a utilizzare i parametri con valori di tabella poiché i driver php mssql non li supportano.

L'unica soluzione che posso immaginare è quella di utilizzare solo varchar (max) per i parametri della stored procedure, ma è considerata una cattiva pratica?

+1

A mio parere, i parametri della stored procedure dovrebbero riflettere il tipo di colonna sottostante. Ciò eviterà errori di troncamento in fase di esecuzione e fornirà un'interfaccia di stored procedure autodocumentata. –

+0

IMHO, non essere così restrittivo con le lunghezze del campo. Lo spazio su disco è economico, e SQL Server è veloce, e la cosa più importante ... le cose cambiano –

+1

o usa le risorse sql dei parametri meglio per il controllo della versione o crea UDT per ogni campo nel tuo database. allora hai solo bisogno di cambiare le definizioni per influenzare sia la tabella che i proc memorizzati – Mark

risposta

0

Risposta breve: Sì.

Che cosa significherebbe se qualcuno passasse in un nome utente lungo 2.147.483.647 caratteri !? Usando varchar (max) intendi che sarebbe ok.

Sono d'accordo con il commento di @DanGuzman. Le colonne della tabella devono essere dimensionate correttamente in primo luogo, quindi i parametri e le variabili devono essere ridimensionati di conseguenza. Se devi cambiare la dimensione della colonna della tabella, allora devi propogare quella modifica altrove - questo è l'approccio migliore.

Il dimensionamento delle colonne della tabella non è sempre semplice, per quanto tempo dovrebbe essere un nome utente? 12 mi sembra poco, 2.147.483.647 decisamente troppo lungo - da qualche parte nel mezzo? ;) @JohnCappelletti ha anche un punto valido: lo stoccaggio e l'elaborazione sono economici rispetto al costo del cambiamento, quindi commetti errori quando si dimensiona.

Se varchar (max) è negativo e non si desidera seguire le migliori pratiche, esiste una via di mezzo? Forse usare un fattore di 10? Qualcosa di sufficientemente al di sopra delle dimensioni reali ma non eccessivamente.

L'altra cosa da tenere a mente, indipendentemente da come si dimensionano i parametri, è il troncamento silenzioso o gli errori di troncamento in fase di esecuzione: controllare le lunghezze in modo esplicito.