SQL: получение информации о таблицах / данных - PullRequest
0 голосов
/ 09 марта 2012

Мне было интересно, не мог бы кто-нибудь объяснить мне способ получения табличной информации, включая информацию о текущих данных, которые хранится в таблице ... Я использую SQL Server 2008 R2 , ниже приведенотекущий скрипт, который я сделал ...

SELECT
Sch.name AS 'Schema',
Tb.Name AS 'Table',
C.Name AS 'Column',
Tp.Name AS 'Type',
C.max_length,
C.precision,
C.scale
FROM Sys.Tables Tb
JOIN Sys.Schemas Sch
ON Sch.Schema_Id = Tb.Schema_Id
JOIN Sys.Columns C
ON C.Object_Id = Tb.Object_Id
JOIN Sys.Types Tp
ON Tp.System_Type_Id = C.System_Type_Id
WHERE Tp.name = 'numeric'
AND C.scale > 4
ORDER BY Sch.name ASC, Tb.name ASC, C.name ASC

Этот скрипт извлекает всю информацию, которая мне требуется для каждой таблицы, которую я имею в своей БД.Затем у меня есть другой скрипт, который я вручную ввожу в таблицу и столбцы, из которых мне нужна информация.

SELECT 'Numeric Count' AS CounterType
, MAX(LEN(CAST(FLOOR(beca_proy_precio) AS VARCHAR(38)))) AS '1'
, MAX(LEN(CAST(FLOOR(beca_proy_precio_dol) AS VARCHAR(38)))) AS '2'
, MAX(LEN(CAST(FLOOR(beca_proy_tc) AS VARCHAR(38)))) AS '3'
FROM Comercial.beca_proyectada

UNION ALL

SELECT 'Decimal Count' AS CounterType
, MAX(LEN(CAST(REVERSE(STUFF(CAST(beca_proy_precio % 1 AS VARCHAR(38)), 1, 2, '')) AS DECIMAL(38, 0)))) AS '1'
, MAX(LEN(CAST(REVERSE(STUFF(CAST(beca_proy_precio_dol % 1 AS VARCHAR(38)), 1, 2, '')) AS DECIMAL(38, 0)))) AS '2'
, MAX(LEN(CAST(REVERSE(STUFF(CAST(beca_proy_tc % 1 AS VARCHAR(38)), 1, 2, '')) AS DECIMAL(38, 0)))) AS '3'
FROM Comercial.beca_proyectada

Что он делает, так это получает самое длинное НЕ БОЛЬШОЕ (целые и десятичные части по отдельности) числовое значение в столбцахуказано.Затем возвращается длина самого длинного целого и десятичного числа.

Например: строка 1 - 940.34910 => 3 целых числа, 4 десятичных знака Строка 2 - 1.1304902 => 1 целых чисел, 7 десятичных знаков

Следовательно, в этом случае он вернет 3 для самого длинного целого числа и 7 для самого длинного десятичного числа

Наконец, чтобы уточнить, что я хочу сделать, это: Присоединитесь к 2 сценариям, где 2-й сценарий получитзначения для каждой таблицы / столбца, которые возвращает 1-й сценарий ... и выводит что-то вроде этого:

Схема / Таблица / Столбец / Тип / Максимальная длина / Точность / Масштаб / Самый длинный целое / Самое длинное десятичное число

Заранее благодарим за любую предоставленную помощь !!

1 Ответ

0 голосов
/ 09 марта 2012

Это немного работы.

Создайте временную таблицу для хранения ваших результатов и информации

Заполните ее данными схемы из запроса с помощью вставки в

Затем используйте курсор и exec ()

. Например, в этой таблице перечислены все таблицы в текущем БД и сколько в них записей.

Create #Results (TableName VarChar(255) not null, TableCount null)

insert into #Results(TableName) Select Name From Sys.Tables

Declare @TableName VarChar(255)
Declare @QueryString VarChar(255)
Declare TableNameCursor Cursor For Select TableName From #Results
Open TableNameCursor
Fetch Next From TableNameCursor Into @TableName
While @@Fetch_Status = 0
Begin
  Select @QueryString = 'Declare @rc int Select @rc = Count(*) From ' + @TableName + ' + Insert #Results Select ''' + @TableName + ''',@rc'
  Exec(@QueryString)
  Fetch Next From TableNameCursor Into @TableName 
End
Close TableNameCursor
DeAllocate TableNameCursor

Select * from #Results

Совет, пока вы вычисляетеВещи замените Exec (@QueryString) на Print @QueryString, вы можете попасть в правильный беспорядок с кавычками.

Да, и выполняемый вами запрос имеет собственную область видимости, он может видеть @rc, но не @ TableName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...