Как получить длину одного столбца во всех таблицах одной базы данных? - PullRequest
1 голос
/ 25 марта 2019

У меня проблемы с получением максимальной длины записей в одном столбце во всех таблицах.

Я бы хотел отобразить только максимальную длину для каждой таблицы для определенного столбца.

Ниже приведено то, что я пробовал, я уже нашел способ вернуть нужную мне колонку, но теперь мне нужно получить максимальную длину. Я знаю, что это не правильный путь.

select  max(len(site)) as site from 
(
SELECT  t.name AS TableName 
FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE 'site%')A

Ожидаемый результат будет отображать имя столбца, имя таблицы, а также максимальную длину записей для этого столбца.

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

Я не понимаю, что вы на самом деле пытаетесь сделать, но я думаю, что вы хотите что-то вроде

CREATE TABLE T1(
  Site1 VARCHAR(45)
);
CREATE TABLE T2(
  Site2 VARCHAR(45)
);

INSERT INTO T1 VALUES ('A'), ('AA');
INSERT INTO T2 VALUES ('BBB'), ('BBBBB');

DECLARE @SQL NVARCHAR(MAX) = 'SELECT ';

SELECT @SQL = @SQL + 
              N'(SELECT MAX(LEN(' + --You can also add ISNULL([Col],0) to get 0
              QUOTENAME(c.name) + ')) FROM '+ 
              QUOTENAME(t.name) + ') AS ' + 
              QUOTENAME(t.name + '.'+c.name) + ', '
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE 'site%';

SET @SQL = LEFT(@SQL, LEN(@SQL)-1);

EXEC sp_executesql @SQL;

Который вернется:

+----------+----------+
| T1.Site1 | T2.Site2 |
+----------+----------+
|        2 |        5 |
+----------+----------+

Демонстрация в реальном времени

0 голосов
/ 25 марта 2019

Если я понимаю ваш вопрос, вы можете попытаться сгенерировать динамический оператор SQL и выполнить этот оператор:

-- Declarations
DECLARE @stm nvarchar(max)
SET @stm = N''

-- Dynamic SQL
SELECT @stm = (
   SELECT CONCAT(
        N'UNION ALL ',
        N'SELECT ''',
        t.name,
        N''' AS TableName, ''',
        c.name,
        N''' AS ColumnName, ',
        N'ValueLength = (SELECT MAX(LEN(',
        QUOTENAME(c.name),
        ')) FROM ',
        QUOTENAME(t.name),
        N')'
   )
   FROM sys.columns c
   JOIN sys.tables t ON c.object_id = t.object_id
   WHERE c.name LIKE 'site%'
   ORDER BY t.name, c.name
   FOR XML PATH('')
)
SET @stm = STUFF(@stm, 1, 10, N'')

-- Execution
PRINT @stm
EXEC sp_executesql @stm
0 голосов
/ 25 марта 2019

Попробуйте: вы получите отдельные сценарии для выполнения.

select 'select Max(len('+COLUMN_NAME+')),'''+COLUMN_NAME+ ''' as ColumnName ,'''+TABLE_NAME+''' as TableName from ' +table_name 
from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'YourColumnName'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...