2014-10-20 63 views
0

我需要确保涉及用户名的所有列的最大长度为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' 

已解决。谢谢!

+0

如果你是新来的SQL我想知道你为什么需要这样的apporach。为什么不选择适当表格的正确列而不是使用'sys.tables'? – 2014-10-20 14:37:08

+0

您是否需要列值的最大可能长度(也存在于'sys.columns'中)或存储的最长实际值的长度(这需要构造动态查询)? – 2014-10-20 14:39:54

+0

@TimSchmelter我们有很多表格和不同的列名称可能的变化。例如,我需要找到'userid'的实例,还有'changedby','modifiedby','%verbed%'的每个实例...我经常使用查询来查找合适的表,但是我以此为学习体验,将字符数最大值添加到查询中。我想也许这种技术将来对其他类型的查询很有用。 – Defpotec2020 2014-10-20 14:41:15

回答

0

有问题的数据是max_length in 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)类型之一(和这个特殊的问题,这意味着它的足够长的时间)。

0

如果任务是“确保所有这些列的最大长度为140”,那么您希望您的结果集是可操作的项目。这里的Max函数不需要起作用,但是您会希望where子句过滤不需要操作的项目。

这将检查的不平等,但如果你正在寻找“至少140个字符”,使第一个条件< 140而非!= 140。条件是按照这个顺序来帮助减少查询成本,因为整数上的相等运算符比任何LIKE运算符都快。

+0

非常感谢你! – Defpotec2020 2014-10-20 14:51:16

+0

WHERE中子句的顺序并不重要 - 优化程序无论如何都会对它们进行重新排序(这通常适用,唯一的例外是“CASE”,因为这会强制执行评估顺序)。您可以验证两个版本的执行计划是否相同。 – 2014-10-20 14:54:02

+0

我明白,在学术上它不应该,但我有两个查询计划的成本为0.64 ..和0.42 ..否则可能会说。这些来自SQL 2008 R2(SP2)实例。 – 2014-10-20 15:02:09