我需要确保涉及用户名的所有列的最大长度为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 :(得分: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)
类型之一(对于此特定问题,这意味着它足够长)。