在列中搜索列并返回列的最大长度

时间:2014-10-20 14:32:26

标签: sql sql-server variables declare

我需要确保涉及用户名的所有列的最大长度为140个字符。我对SQL很新,我很好奇你将如何做到这一点。

我首先返回包含相关列名的所有表的列表。同时,我还希望看到这些列的字符限制。这是我到目前为止所得到的,除了我不知道如何创建一个将填充查询的Column和Length部分的变量。我正在使用SQL Server 2008.

SELECT 
    t.name AS 'Table Name', 
    c.name AS 'Column Name', 
    max(len(%COLUMN_NAME%)) AS 'Max Length'
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%COLUMN_NAME%'
ORDER BY 'Table Name'

解决。谢谢!

2 个答案:

答案 0 :(得分:0)

如果任务是"确保所有此类列的最大长度为140",那么您希望结果集是可操作的项目。这里的Max函数不需要发挥作用,但是你需要where子句来过滤不需要操作的项。

SELECT 
    t.name AS 'Table Name', 
    c.name AS 'Column Name', 
    c.max_length AS 'Max Length'
FROM sys.tables AS t
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.max_length != 140
    AND c.name LIKE '%COLUMN_NAME%'
ORDER BY t.name

这会检查不平等,但如果您要查找&#34;至少140个字符&#34;,请创建第一个条件< 140而不是!= 140。标准按此顺序有助于使查询成本更低,因为整数上的相等运算符比任何LIKE运算符都快。

答案 1 :(得分:0)

有问题的数据是max_length中的sys.columns,我们还需要特别处理MAX和Unicode类型。您还想省略系统表。

SELECT 
    t.name AS 'Table Name', 
    c.name AS 'Column Name', 
    CASE WHEN tp.[name] IN ('nchar', 'nvarchar') AND c.max_length <> -1 THEN c.max_length / 2 ELSE c.max_length END AS 'Max Length'
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
INNER JOIN sys.types tp ON c.system_type_id = tp.system_type_id
WHERE t.is_ms_shipped = 0 AND c.name LIKE '%name%'
ORDER BY t.name

如果max_length = -1,则类型是CHAR(MAX)类型之一(对于此特定问题,这意味着它足够长)。