Выберите имена столбцов и первые 1 записи вместе, динамически - PullRequest
0 голосов
/ 04 апреля 2019

Я пытался выбрать верхнее значение 1 столбца из таблицы, чтобы получить представление о данных на основе выходных данных (то есть, эквивалентно,

  SELECT c.name FROM st.Name

. Этот запрос извлекает имена столбцов и их тип данных пос таблицами, в которых они находятся. Я ищу дополнительный столбец, который показывает первую 1 запись из столбцов.

SELECT 
st.name 'Table Name', 
c.name 'Column Name', 
t.name 'Data Type'

FROM sys.columns c
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
LEFT OUTER JOIN sys.tables st ON st.object_id = i.object_id 

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

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Таким образом, способ, которым это работает, в основном создает кучу выборов, таких как:

SELECT 'dbo' AS [Schema Name]
     , 'Table1' AS [Table Name]
     , 'Id' AS [Column Name]
     , 'bigint' AS [Data Type]
     , (SELECT TOP 1 CONVERT(NVARCHAR(MAX), Id) FROM [dbo].[Table1]) AS [Top 1 Value] 

UNION ALL

-- Another table

Значения конвертируются в NVARCHAR(MAX), потому что тип столбца в объединении должен совпадать, и я думаю, что это лучшая ставка.

Вот так:

DECLARE @query NVARCHAR(MAX) = ''
SELECT @Query += 
'SELECT ' + '''' + sch.name + '''' + ' AS [Schema Name],' + CHAR(13)+CHAR(10)
          + '''' + st.name  + '''' + ' AS [Table Name],' + CHAR(13)+CHAR(10)
          + '''' + c.name   + '''' + ' AS [Column Name],' + CHAR(13)+CHAR(10)
          + '''' + t.name   + '''' + ' AS [Data Type],' + CHAR(13)+CHAR(10)
          + '(SELECT TOP 1 CONVERT(NVARCHAR(MAX), ' + c.name + ') FROM ' + QUOTENAME(sch.name) + '.' + QUOTENAME(st.name) + ') AS [Top 1 Value] ' + CHAR(13)+CHAR(10)
          + 'UNION ALL'+CHAR(13)+CHAR(10)
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
JOIN sys.tables st ON st.object_id = i.object_id 
JOIN sys.schemas sch ON sch.schema_id = st.schema_id

-- Get rid of trailing UNION ALL
SET @Query = LEFT(@Query, LEN(@Query) - LEN('UNION ALLxx'))

PRINT @query
EXEC sp_executesql @query

Попробуйте сначала запустить TOP 10 или что-то подобное, чтобы убедиться, что он дает правильные результаты.

0 голосов
/ 04 апреля 2019

вы можете использовать цикл while с d sql

-

--drop table #temp

SELECT 
    CONCAT(s.name,'.',st.name) 'Table Name', 
    c.name 'Column Name', 
    t.name 'Data Type',
    CAST(null AS datetime) as IND,
    cast('' AS varchar(max)) data
    INTO #temp
FROM sys.columns c
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
INNER JOIN sys.tables st ON st.object_id = i.object_id
INNER JOIN sys.schemas s ON s.schema_id = st.schema_id



declare 
@TableName varchar(255),
@ColumnName Varchar(255),
@sql varchar(max)

WHILE (SELECT count(*) FROM #temp where IND is null) > 0
begin

        SELECT TOP 1 
            @TableName = [Table Name]
            ,@ColumnName = [Column Name]
        FROM #temp
        WHERE IND IS NULL

        SET @sql = 
        'update  #temp 
         set data  = (SELECT top 1 [' + @ColumnName + '] from ' + @TableName + '),
         IND = getdate()
         where [Table Name] = ''' + @TableName + ''' and [Column Name] = ''' +  @ColumnName + ''''

        exec(@sql)
end


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