【发布时间】:2019-03-09 09:25:14
【问题描述】:
因为我想将列转换为不是varchar(MAX) 我想查看每列的最大数据长度来决定新的大小应该是多少。
我有这个查询来查找我所有的(n)varchar(MAX) 列。
SELECT [TABLE_NAME], [COLUMN_NAME]
FROM information_schema.columns
WHERE DATA_TYPE IN ('varchar', 'nvarchar')
AND CHARACTER_MAXIMUM_LENGTH = -1
ORDER BY TABLE_NAME, COLUMN_NAME
例如,我有一个客户表,在结果中,以下是我的客户表的输出
+------------+--------------+
| TABLE_NAME | COLUMN_NAME |
+------------+--------------+
| customers | name |
| customers | address |
| customers | postal_code |
| customers | city |
| customers | email |
| customers | phone_number |
+------------+--------------+
通过运行以下查询:
SELECT MAX(DATALENGTH(name)) FROM customers
SELECT MAX(DATALENGTH(address)) FROM customers
SELECT MAX(DATALENGTH(postal_code)) FROM customers
SELECT MAX(DATALENGTH(city)) FROM customers
SELECT MAX(DATALENGTH(email)) FROM customers
SELECT MAX(DATALENGTH(phone_number)) FROM customers
我可以得到我想要的结果,但我真的希望它只是一个返回如下内容的查询:
+------------+--------------+------------+
| TABLE_NAME | COLUMN_NAME | Datalength |
+------------+--------------+------------+
| customers | name | 93 |
| customers | address | 122 |
| customers | postal_code | 6 |
| customers | city | 44 |
| customers | email | 75 |
| customers | phone_number | 18 |
+------------+--------------+------------+
我试过了
SELECT
[TABLE_NAME], [COLUMN_NAME],
(SELECT MAX(DATALENGTH(COLUMN_NAME))
FROM TABLE_NAME) AS 'MaxContentLength'
FROM information_schema.columns
WHERE DATA_TYPE IN ('varchar', 'nvarchar')
AND CHARACTER_MAXIMUM_LENGTH = -1
ORDER BY TABLE_NAME, COLUMN_NAME
但我收到此错误:
消息 208,第 16 级,状态 1,第 1 行
无效的对象名称“TABLE_NAME”
我该如何解决这个问题(或者有其他方法可以做我想做的事吗?)
【问题讨论】:
-
Table_name 不是一个表,它是一个列。您不能在子查询中执行此操作。
-
根据documentation,对于 xml 和大值类型数据,CHARACTER_MAXIMUM_LENGTH 为 -1。那么,您是否试图获得 XML 类型的最大可能长度?或者是其他东西?对于 xml,它通常是 2GB。 ref
-
@LukStorms 我已经更新了我的问题,以便更清楚地说明我在寻找什么
标签: sql sql-server max information-schema datalength