SQL Server молча усекает varchar в хранимых процедурах

Согласно в этом обсуждении на форуме , 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, если я действительно хочу, чтобы хранимая процедура завершалась сбоем, когда передается слишком длинная строка ? Может ли это быть лучшая практика? Беззвучное усечение, которое нельзя отключить, мне кажется глупым.

67
задан Jez 7 January 2011 в 17:05
поделиться