2016-05-29 94 views
5

Ich habe eine relativ einfache Website, die PHP + mssql verwendet. Ich habe verschiedene gespeicherte Prozeduren, die Arbeit einfach einfügen und löschen. Das Problem, mit dem ich konfrontiert bin, ist, dass viele der Parameter, die ich in die gespeicherte Prozedur übergebe, die gleiche Länge haben wie die Spalte, in die ich die Daten einfügen werde.sql Server gespeicherte Prozedur verwenden varchar max als Parameter

Zum Beispiel habe ich eine gespeicherte Prozedur, um einen Benutzer zu registrieren. Die gespeicherte Prozedur hat als Typ einen Parameter @USERNAME mit varchar(12). Die Spalte USERNAME in der Tabelle USER hat den gleichen Typ mit dieser Länge. Im Prinzip ist das nicht wirklich ein Problem. Aber ich würde lieber in der Lage sein, die Spaltenlänge USERNAME frei zu ändern, ohne auch die Länge des gespeicherten Prozedurparameters ändern zu müssen.

Ich kann Tabellenwerte nicht verwenden, da die mssql php-Treiber sie nicht unterstützen.

Die einzige Lösung, die ich mir vorstellen kann, ist nur varchar (max) für die gespeicherten Prozedurparameter zu verwenden, aber wird dies als schlechte Praxis angesehen?

+1

Meiner Meinung nach sollten die gespeicherten Prozedurparameter den zugrunde liegenden Spaltentyp widerspiegeln. Das wird Laufzeitkürzungsfehler vermeiden und eine selbst-dokumentierende gespeicherte Prozedurschnittstelle bereitstellen. –

+0

IMHO, seien Sie nicht so restriktiv mit Feldlängen. Speicherplatz ist billig, und SQL Server ist schnell und am wichtigsten ... Dinge ändern –

+1

entweder Parameter sql Ressourcen verwenden IMO besser für die Versionskontrolle oder erstellen UDTs für jedes Feld in Ihrer Datenbank. Dann müssen Sie nur die Definitionen ändern, um sowohl die Tabelle als auch die gespeicherten Prozeduren zu beeinflussen – Mark

Antwort

0

Kurze Antwort: Ja.

Was würde es bedeuten, wenn jemand einen Benutzernamen mit 2.147.483.647 Zeichen eingeben würde? Mit varchar (max) implizieren Sie, dass es in Ordnung wäre.

Ich bin in Übereinstimmung mit dem Kommentar von @DanGuzman. Tabellenspalten sollten zuerst richtig dimensioniert werden, dann sollten Parameter und Variablen entsprechend dimensioniert werden. Wenn Sie die Größe der Tabellenspalte ändern müssen, müssen Sie diese Änderung an anderer Stelle propagieren - das ist der Best-Practice-Ansatz.

Größe von Tabellenspalten ist nicht immer einfach - wie lange sollte ein Benutzername sein? 12 scheint mir kurz, 2.147.483.647 definitiv zu lang - irgendwo dazwischen? ;) @JohnCappelletti hat auch einen gültigen Punkt - Lagerung und Verarbeitung sind im Vergleich zu den Kosten der Veränderung billig, also irr auf der großen Seite beim Sizing.

Wenn Varchar (max) schlecht ist, und Sie nicht Best Practice folgen wollen, gibt es einen Mittelweg? Vielleicht einen Faktor von 10 verwenden? Etwas über der tatsächlichen Größe, aber nicht übermäßig.

Die andere Sache, auf die Sie achten sollten, ist, unabhängig von der Größe Ihrer Parameter, das automatische Abschneiden oder das Abschneiden der Laufzeit - überprüfen Sie die Längen explizit.