Согласно этому обсуждению на форуме , 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
хранимой процедуры.
Так вот, иногда это поведение может быть удобным, но я понимаю, что НЕТ СПОСОБА его отключать. Это очень раздражает, так как я хочу ошибиться, если передать слишком длинную строку хранимой процедуре. Кажется, есть 2 способа справиться с этим.
Во-первых, объявите параметр @testStringField
сохраненного процесса размером 6 и проверьте, не превышает ли его длина 5. Это похоже на хак и включает в себя раздражающее количество стандартного кода.
Во-вторых, просто объявите ВСЕ параметры хранимой процедуры varchar равными varchar(max)
, а затем допустите сбой оператора INSERT
в хранимой процедуре.
Последнее, кажется, работает нормально, поэтому мой вопрос: это хорошая идея - использовать varchar(max)
ВСЕГДА для строк в хранимых процедурах SQL Server, если я действительно хочу, чтобы хранимый процесс не выполнялся при передаче слишком длинной строки ? Может ли это быть даже лучшей практикой? Молчание, которое нельзя отключить, кажется мне глупым.