假设我有一个SQL表,该表具有一个称为“备注”的varchar [1000]字段。
我想制作一条SQL语句,该语句在执行时将返回1000,或者将来可能会将varchar字段的大小更改为任何大小。
有点像SELECT size(Remarks) FROM mytable
。
我该怎么做呢?
Answers:
select column_name, data_type, character_maximum_length
from information_schema.columns
where table_name = 'myTable'
AND column_name = 'Remarks'
如果只想过滤出一列,则可以指定其他子句。
INFORMATION_SCHEMA
是ANSI标准的东西-根本不是MySQL或SQL Server特有的!
AND table_schema = 'mydatabase'
对于SQL Server(2008及更高版本):
SELECT COLUMNPROPERTY(OBJECT_ID('mytable'), 'Remarks', 'PRECISION');
COLUMNPROPERTY返回列或参数(标识,列/参数,属性)的信息。PRECISION属性返回列或参数的数据类型的长度。
对于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
这是一个用于计算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]();