2015-10-28 3 views
0

Можно ли объявить строчную переменную фиксированной длины с длиной 0? Случай использования предназначен для динамической генерации SQL. У меня есть пара gimmes сразу сОбъявить переменную фиксированной длины равную '' (пустая строка)

declare 
    @SqlQuery nvarchar(max) = '', 
    @lb nchar(1) = char(10), 
    @tab nchar(1) = char(9), 
    @sq nchar(1) = char(39), -- single quote 
    @dq nchar(2) = char(39) + char(39) -- 2x single quote 

Для удобства чтения ниже в прок, я хотел бы включить «пустая строка» переменная @es для isnull(Column, @es) очистки, так что я не нарушу конкатенацию на null значение. Однако я не добился большого успеха в этом. Попытки ниже. Любое понимание?

go 
declare @EmptyString char(0) = '' ; 
print 'empty string [' + @EmptyString + ']'; 
--Msg 1001, Level 15, State 1, Line 1 
--Line 1: Length or precision specification 0 is invalid. 
go 
declare @EmptyString char(1) = '' ; 
print len(@EmptyString); --0 
print '[' + replicate(@EmptyString, 10) + ']'; --[   ] 
go 
+0

Почему этот вопрос мигрировали в С.О.? Это бессмысленно? (этот вопрос не для Питера, кстати). –

+0

@srutzky он был отмечен как не по моде. Я предполагаю, что это рассматривалось как не до уровня для вопросов dba.SE. Хотя я, возможно, не согласен с этим, я попросил перевести на SO как более общий вопрос, а не жить с флагом. –

+0

Да, но это было не в тему, и у него уже было 2 (последний раз, когда я проверил) повторное открытие голосов (1 из них мой). Я не помню точного текста причины «вне темы», но это просто кажется глупым. –

ответ

4

Вы не можете объявить строчную переменную или поле с максимальной длиной 0 (по крайней мере, не в SQL Server). Учитывая это ограничение, тип данных фиксированной длины CHAR/NCHAR не может по определению содержать пустую строку, так как минимальная длина равна 1 и всегда будет пустой.

Причина, по которой len(@EmptyString) показана как 0, заключается в том, что для сравнения используются конечные пробелы. Если вы также должны попробовать print datalength(@EmptyString);, вы увидите, что он возвращает 1, на котором учитывается пробел. И если бы вы изменить declare @EmptyString char(1) быть NCHAR(1), то DATALENGTH(@EmptyString) вернется 2, даже если функция LEN будет по-прежнему возвращать 0.

Причина, по которой '[' + replicate(@EmptyString, 10) + ']' производства [ ] происходит потому, что CHAR(1), будучи пустой мягкий, не на самом деле пуст, даже если он установлен только '', так что оператор действительно реплицирует пробельный символ 10 раз.

Единственный способ получить пустую строку - использовать NVARCHAR(x) = N''. В то время как x может технически быть значением от 1 до 4000 или даже MAX, для этой цели, вероятно, должно быть только 1. Переменный характер NVARCHAR/VARCHAR даст вам пустую строку, даже если она объявлена ​​как NVARCHAR(100).

Ниже показано, что это действительно работает:

DECLARE @EmptyString NVARCHAR(10) = N''; 
PRINT LEN(@EmptyString); -- 0 
PRINT DATALENGTH(@EmptyString); -- 0 
PRINT '[' + REPLICATE(@EmptyString, 10) + ']'; -- [] 
Смежные вопросы