Получить первую строку в таблице при распечатке имени таблицы и имени столбца - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно быстро просмотреть данные в наборе данных MS SQL и найти следующий код, который дает мне все, кроме последнего столбца, который мне нужен. В этом третьем столбце должны отображаться данные из первого ряда.

SELECT TABLE_NAME, COLUMN_NAME  FROM INFORMATION_SCHEMA.COLUMNS

enter image description here

Так что мой вопрос в том, как мне сформулировать запрос SQL, чтобы получить третий столбец с данными из первой строки)?

// Обновление Этот код дает мне все, что я хочу, кроме таблицы, из которой поступают данные. (На аналогичный вопрос ответил Ярослав в Выберите первые 3 строки каждой таблицы в базе данных )

DECLARE @sql VARCHAR(MAX)=''; 
SELECT @sql=@sql+'SELECT TOP 3 * FROM '+'['+SCHEMA_NAME(schema_id)+'].['+name+']'+';'
FROM sys.tables
EXEC(@sql)

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Одним из подходов, если я правильно понял, была недокументированная хранимая процедура sp_MsForeachTable. Вопросительный знак является заполнителем для имени таблицы там:

Подсказка: отредактируйте "YourDataBase" ...

EXEC sp_msforeachtable 'USE YourDataBase;SELECT TOP 1 ''?'' AS TableName, * FROM ?';

С помощью этого запроса вы можете легко исследовать все первые строки

CREATE TABLE #test(TableName NVARCHAR(MAX),Content XML)

EXEC sp_msforeachtable 
'USE YourDataBase;INSERT INTO #test SELECT ''?'' AS TableName, (SELECT TOP 1 * FROM ? FOR XML PATH(''row''))';

SELECT * FROM #test;

UPDATE

Ваш собственный код также будет возвращать имя таблицы. Попробуйте это

DECLARE @sql VARCHAR(MAX)=''; 
SELECT @sql=@sql+'SELECT TOP 3 ''' + t.[name] + ''' AS TableName, * FROM '+'['+SCHEMA_NAME(schema_id)+'].['+name+']'+';'
FROM sys.tables t
EXEC(@sql)
0 голосов
/ 28 июня 2018

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

Редактировать: Вы также можете написать цикл и выполнить каждое выражение в цикле, вставить значение в итоговую таблицу, затем просто выбрать из этой таблицы, и все будет хорошо.

SELECT
    t.String
   ,t.q
   ,t.TABLE_NAME
   ,t.q2
   ,t.tbname
   ,t.com2
   ,t.q4
   ,t.COLUMN_NAME
   ,t.q5
   ,t.Columnname
   ,t.com3
   ,t.ColName
   ,t.[From]
   ,t.FromSelect
FROM (SELECT
        'Select top 1 ' AS String
       ,'''' q
       ,TABLE_NAME
       ,'''' q2
       ,'as TableName'
        as tbname
       ,',' com2

       ,'''' q4
       ,COLUMN_NAME
       ,'''' q5
       ,'as COLUMN_NAME'
       as Columnname
       ,',' com3
       ,COLUMN_NAME as ColName
       , 'Value From ' as [From]
       ,TABLE_NAME as FromSelect
       ,ROW_NUMBER() OVER (PARTITION BY TABLE_NAME ORDER BY TABLE_NAME DESC, COLUMN_NAME) rn
    FROM INFORMATION_SCHEMA.COLUMNS c
    ) t
WHERE rn = 1;

Результат будет примерно таким для каждой таблицы.

Select top 1    '   zipcodes    '   as TableName    ,   '   CITY    '   as COLUMN_NAME  ,   CITY    Value From  zipcodes
Select top 1    '   _BHCAMERAPRICE  '   as TableName    ,   '   _BHID   '   as COLUMN_NAME  ,   _BHID   Value From  _BHCAMERAPRICE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...