Ответ 1
select column_name, data_type, character_maximum_length
from information_schema.columns
where table_name = 'myTable'
Предположим, что у меня есть таблица SQL, в которой есть поле varchar [1000], называемое "Заметки".
Я хотел бы создать единый оператор SQL, который при запуске вернет 1000 или любой размер поля varchar может быть изменен в будущем.
Что-то вроде SELECT size(Remarks) FROM mytable
.
Как это сделать?
select column_name, data_type, character_maximum_length
from information_schema.columns
where table_name = 'myTable'
В SQL Server специально:
SELECT DATALENGTH(Remarks) AS FIELDSIZE FROM mytable
Это будет работать с SQL SERVER...
SELECT COL_LENGTH('Table', 'Column')
Я искал размер TOTAL столбца и попал в эту статью, мое решение основано на MarcE.
SELECT sum(DATALENGTH(your_field)) AS FIELDSIZE FROM your_table
Для SQL Server (2008 и выше):
SELECT COLUMNPROPERTY(OBJECT_ID('mytable'), 'Remarks', 'PRECISION');
COLUMNPROPERTY возвращает информацию для столбца или параметра (id, column/parameter, property). Свойство PRECISION возвращает длину типа данных столбца или параметра.
Где функция для вычисления максимальной допустимой длины для varchar (Nn):
CREATE FUNCTION [dbo].[GetMaxVarcharColumnLength] (@TableSchema NVARCHAR(MAX), @TableName NVARCHAR(MAX), @ColumnName VARCHAR(MAX))
RETURNS INT
AS
BEGIN
RETURN (SELECT character_maximum_length FROM information_schema.columns
WHERE table_schema = @TableSchema AND table_name = @TableName AND column_name = @ColumnName);
END
Использование:
IF LEN(@Name) > [dbo].[GetMaxVarcharColumnLength]('person', 'FamilyStateName', 'Name')
RETURN [dbo].[err_Internal_StringForVarcharTooLong]();
Для t-SQL я использую следующий запрос для столбцов varchar (показывает свойства сопоставления и is_null):
SELECT
s.name
, o.name as table_name
, c.name as column_name
, t.name as type
, c.max_length
, c.collation_name
, c.is_nullable
FROM
sys.columns c
INNER JOIN sys.objects o ON (o.object_id = c.object_id)
INNER JOIN sys.schemas s ON (s.schema_id = o.schema_id)
INNER JOIN sys.types t ON (t.user_type_id = c.user_type_id)
WHERE
s.name = 'dbo'
AND t.name IN ('varchar') -- , 'char', 'nvarchar', 'nchar')
ORDER BY
o.name, c.name
select column_name, data_type, character_maximum_length
from INFORMATION_SCHEMA.COLUMNS
where table_name = 'Table1'