Как выяснить (во время выполнения), является ли тип в t-sql фиксированной длины или нет?
Можно ли узнать время выполнения с помощью t-sql, если тип (например, nvarchar или int) имеет фиксированную длину или нет, путем запроса некоторой системной таблицы?
Причина, по которой мне нужно это сделать, заключается в том, что мне нужно сгенерировать sql-код времени выполнения и нужно сгенерировать некоторые объявления (DECLARE @foo SOMETYPE(LENGTH)
или же DECLARE @foo SOMETYPE
) в зависимости от типа некоторых столбцов (которые неизвестны во время разработки).
Моя текущая ставка в том, что я могу проверить, sys.all_columns.max_length = sys.types.max_length
и если это так, предположим, что это фиксированная длина (так как max_length
кажется, есть специальный код (-1), по крайней мере, для nvarchar).
2 ответа
Вы можете посмотреть на information_schema.columns. Если столбец с символьным типом имеет максимальную длину, он будет указан в character_maximum_length, числовые поля имеют точность, определенную в numeric_precision. Пара замечаний: насколько мне известно, тип int всегда 4 байта, также, любой из типов var по определению не имеет фиксированной длины, и сохраняет его до максимальной длины, только если nvarchar(10) содержит 2 символьная строка, она хранит только 2 символа. Таким образом, чтобы обнаружить строки фиксированной длины, вы должны искать типы char или nchar.
Да, это возможно. Посмотрите на код встроенного хранимого процесса sp_columns, чтобы увидеть, как это сделать.