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