2012-12-14 8 views
5

Mam skrypt, który stworzyłem dla naszej linii produkcyjnej, w której użytkownik wprowadza pewne zmienne do skryptu przed wykonaniem. Problem polega na tym, że zmienne to NVARCHAR (9), a jeśli użytkownik wprowadzi 10 żądań znakowych, ostatni znak zostanie odcięty (zgodnie z oczekiwaniami), co chcę wiedzieć, w jaki sposób mogę spowodować, że SQL zgłosi błąd, jeśli wprowadzi wartość, która jest zbyt długi? Ten problem wynika z tego, że użytkownicy palą swoje wkłady. Przykład:Jak wymusić szerokość wejściową nvarchar w SQL Server?

Valid input - 
DECLARE @ClientCode NVARCHAR(9) 
SET @ClientCode = N'ABCDEFGHI' 
SELECT @ClientCode 

Results 
ABCDEFGHI 

Invalid input -

DECLARE @ClientCode NVARCHAR(9) 
SET @ClientCode = 'ABCDDEFGHI' 
SELECT @ClientCode 

Results 
ABCDDEFGH 

Co mam nadzieję na to ustawienie, które będą miały SSMS zgłosi błąd. Co mam nadzieję, w celu uniknięcia jest coś takiego -

DECLARE @ClientCode NVARCHAR(50) 
... 

IF LEN(@ClientCode) > 9 
RAISERROR('Too long dummy.',16,1) 


Dzięki Ci pomóc

+3

Myślę, że powinieneś umieścić tę stronę sprawdzania poprawności po stronie klienta, zamiast w bazie danych ... nie musisz wykonywać podróży w obie strony do bazy danych tylko po to, aby poinformować użytkownika, że ​​dane wejściowe były zbyt długie. Co więcej, nie pozwól im nawet wprowadzić zbyt długiego ciągu znaków. –

+0

Zgadzam się z tobą. Jednak nie jest to opcja w systemie, nad którym pracuję. Te skrypty są uruchamiane przez bardzo techników JR z SSMS. Więc nie ma strony klienta. Ten skrypt służy do tworzenia rzeczy po stronie klienta. Moim rozwiązaniem byłoby wypalenie wszystkich tych skryptów za pomocą interfejsu sieciowego, z którego technicy mogą się logować, wprowadzić swoje parametry do formularza internetowego, a następnie kliknąć "idź". Niestety kierownictwo chce zachować status quo: "Robimy to w ten sposób od lat Nie rozumiem, dlaczego powinniśmy wydawać pieniądze, aby zrobić to we właściwy sposób" ... –

Odpowiedz

1

proszę zobaczyć SQL Server silently truncates varchar's in stored procedures - SQL Server nie można ustawić automatycznie podnieść błąd metody dla wkładek wewnątrz procedury przechowywanej, więc musisz sam wykonać test. Możesz to zrobić w procedurze przechowywanej (kod podany jako "mający nadzieję uniknąć") lub możesz wcześniej potwierdzić w aplikacji klienckiej.

+0

Dzięki Scott, Tak właśnie myślałem odpowiedź byłaby. Spędziłem trochę czasu, przeglądając pytanie tutaj, ale nie natknąłem się na to. . –

0

Mam również patrząc na zapytania Scott Chapman odniesień w jego odpowiedzi, jednak znalazłem igorp za odpowiedź w połowie drogi w dół ciekawy, musiałem mu włamać się trochę naprawić SQL, ale może pracować:

declare @p1 varchar(max), @p2 varchar(max) 
select @p1 = 'abcd' 
declare @p1Int varchar(2), @p2Int varchar(3) 
declare @test table (p1 varchar(2), p2 varchar(3)) 
insert into @test (p1,p2) values (@p1, @p2) 
select @p1Int=p1, @p2Int=p2 from @test 
+0

To interesujące rozwiązanie. Jest jednak tak uciążliwe jak DECLARE @ClientCode nvarchar (50) ... If Len (@ClientCode)> 9 RAISERROR ("Zbyt długo manekin., 16,1) –

Powiązane problemy