在 SQL 服务器查询中检索数据长度以及列和表
Retrieving datalength along with columns and tables in SQL Server query
因为我想将列转换为非 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,在结果中,我的客户 table
输出以下结果
+------------+--------------+
| 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
但是我得到这个错误:
Msg 208, Level 16, State 1, line 1
Invalid object name 'TABLE_NAME'
我该如何解决这个问题(或者有其他方法可以满足我的要求吗?)
这对你来说正确吗?
SELECT
I.TABLE_NAME, I.COLUMN_NAME,
(SELECT MAX(DATALENGTH(COLUMN_NAME))
FROM information_schema.columns
WHERE TABLE_NAME = I.TABLE_NAME) AS 'MaxContentLength'
FROM information_schema.columns AS I
WHERE I.DATA_TYPE IN ('varchar', 'nvarchar')
AND CHARACTER_MAXIMUM_LENGTH = -1
ORDER BY I.TABLE_NAME, I.COLUMN_NAME
那些使用 DATALENGTH 的多个查询可以合并为一个。
未经测试的记事本涂鸦
SELECT
[TABLE_NAME],
[COLUMN_NAME],
[Datalength]
FROM
(
SELECT
'customers' AS [TABLE_NAME],
MAX(DATALENGTH(name)) AS name,
MAX(DATALENGTH(address)) AS address,
MAX(DATALENGTH(postal_code)) AS postal_code,
MAX(DATALENGTH(city)) AS city,
MAX(DATALENGTH(email)) AS email,
MAX(DATALENGTH(phone_number)) AS phone_number
FROM customers
) AS src
UNPIVOT
(
[Datalength]
FOR [COLUMN_NAME] IN
([name], [address], [postal_code], [city], [email], [phone_number])
) AS unpvt;
这是我解决你问题的方法,可能不是最快的方法。
declare @tbl varchar(128), @fld varchar(128)
declare @res table (
[Table_Name] varchar(128), [Column_Name] varchar(128), [DataLength] int)
declare c1 cursor local for
select c.TABLE_NAME, c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c
join INFORMATION_SCHEMA.TABLES t on
(t.TABLE_CATALOG = c.TABLE_CATALOG and
t.TABLE_SCHEMA = c.TABLE_SCHEMA and
t.TABLE_NAME = c.TABLE_NAME)
where t.TABLE_TYPE <> 'VIEW'
and c.DATA_TYPE in ('varchar', 'nvarchar')
and c.CHARACTER_MAXIMUM_LENGTH = -1
open c1
fetch next from c1 into @tbl, @fld
while @@FETCH_STATUS=0
begin
insert into @res
exec ('select '''
+@tbl+''' as [TABLE_NAME], '''
+@fld+''' as [COLUMN_NAME], max(datalength('
+@fld+')) as [DataLength] from '
+@tbl)
fetch next from c1 into @tbl, @fld
end
close c1
deallocate c1
select * from @res
因为我想将列转换为非 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,在结果中,我的客户 table
输出以下结果+------------+--------------+
| 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
但是我得到这个错误:
Msg 208, Level 16, State 1, line 1
Invalid object name 'TABLE_NAME'
我该如何解决这个问题(或者有其他方法可以满足我的要求吗?)
这对你来说正确吗?
SELECT
I.TABLE_NAME, I.COLUMN_NAME,
(SELECT MAX(DATALENGTH(COLUMN_NAME))
FROM information_schema.columns
WHERE TABLE_NAME = I.TABLE_NAME) AS 'MaxContentLength'
FROM information_schema.columns AS I
WHERE I.DATA_TYPE IN ('varchar', 'nvarchar')
AND CHARACTER_MAXIMUM_LENGTH = -1
ORDER BY I.TABLE_NAME, I.COLUMN_NAME
那些使用 DATALENGTH 的多个查询可以合并为一个。
未经测试的记事本涂鸦
SELECT
[TABLE_NAME],
[COLUMN_NAME],
[Datalength]
FROM
(
SELECT
'customers' AS [TABLE_NAME],
MAX(DATALENGTH(name)) AS name,
MAX(DATALENGTH(address)) AS address,
MAX(DATALENGTH(postal_code)) AS postal_code,
MAX(DATALENGTH(city)) AS city,
MAX(DATALENGTH(email)) AS email,
MAX(DATALENGTH(phone_number)) AS phone_number
FROM customers
) AS src
UNPIVOT
(
[Datalength]
FOR [COLUMN_NAME] IN
([name], [address], [postal_code], [city], [email], [phone_number])
) AS unpvt;
这是我解决你问题的方法,可能不是最快的方法。
declare @tbl varchar(128), @fld varchar(128)
declare @res table (
[Table_Name] varchar(128), [Column_Name] varchar(128), [DataLength] int)
declare c1 cursor local for
select c.TABLE_NAME, c.COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS c
join INFORMATION_SCHEMA.TABLES t on
(t.TABLE_CATALOG = c.TABLE_CATALOG and
t.TABLE_SCHEMA = c.TABLE_SCHEMA and
t.TABLE_NAME = c.TABLE_NAME)
where t.TABLE_TYPE <> 'VIEW'
and c.DATA_TYPE in ('varchar', 'nvarchar')
and c.CHARACTER_MAXIMUM_LENGTH = -1
open c1
fetch next from c1 into @tbl, @fld
while @@FETCH_STATUS=0
begin
insert into @res
exec ('select '''
+@tbl+''' as [TABLE_NAME], '''
+@fld+''' as [COLUMN_NAME], max(datalength('
+@fld+')) as [DataLength] from '
+@tbl)
fetch next from c1 into @tbl, @fld
end
close c1
deallocate c1
select * from @res