В соответствии с эта дискуссия форума, SQL Server (я использую 2005, но, как я понимаю, это относится и к 2000 и 2008 годам), тихо обрезает любые varchar
вы указываете в качестве параметров хранимой процедуры длину varchar, даже если вставка этой строки непосредственно с помощью INSERT
приведет к ошибке. например. Если я создам эту таблицу:
CREATE TABLE testTable(
[testStringField] [nvarchar](5) NOT NULL
)
тогда, когда я выполняю следующее:
INSERT INTO testTable(testStringField) VALUES(N'string which is too long')
Я получаю сообщение об ошибке:
String or binary data would be truncated.
The statement has been terminated.
Великий. Сохранение целостности данных, и вызывающий абонент знает об этом. Теперь давайте определим хранимую процедуру, чтобы вставить это:
CREATE PROCEDURE spTestTableInsert
@testStringField [nvarchar](5)
AS
INSERT INTO testTable(testStringField) VALUES(@testStringField)
GO
и выполните его:
EXEC spTestTableInsert @testStringField = N'string which is too long'
Нет ошибок, 1 строка затронута. Строка вставляется в таблицу, а testStringField
- как "strin". SQL Server молча усекал параметр хранимой процедуры varchar
.
Теперь это может быть удобно время от времени, но я вижу, что нет возможности отключить его. Это очень раздражает, так как я хочу, чтобы предмет был ошибкой, если я слишком долго переношу строку в хранимую процедуру. Кажется, есть два способа справиться с этим.
Сначала объявите сохраненный параметр proc @testStringField
размером 6 и проверьте, не превышает ли его длину 5. Это кажется немного взломанным и включает в себя раздражающее количество кода шаблона.
Во-вторых, просто объявите ВСЕ параметры хранимой процедуры varchar как varchar(max)
, а затем пусть оператор INSERT
в хранимой процедуре завершится с ошибкой.
Последний, похоже, работает нормально, поэтому мой вопрос: хорошо ли использовать varchar(max)
ВСЕГДА для строк в хранимых процедурах SQL Server, если я действительно хочу, чтобы хранимый proc завершился с ошибкой, когда слишком длинна строка передана? Может ли это быть лучшей практикой? Безмолвное усечение, которое нельзя отключить, кажется мне глупым.