Как извлечь имя столбца из таблицы, которая хранится в виде значения в другой таблице - PullRequest
0 голосов
/ 28 сентября 2019

Я довольно новичок в SQL, поэтому любая помощь будет высоко ценится

У меня есть таблица, содержащая список имен таблиц в столбце таблицы, и мне нужно получить столбец с именем [Last Refreshed] из всех перечисленных таблиц.Все таблицы имеют разную структуру, но все они имеют столбец [Last Refreshed].Мне удалось вставить имена таблиц в переменную sql, но до этого момента я застрял.Я надеюсь, что мне удалось объяснить, что мне нужно, но я также приложил свой код.

Declare @tables nvarchar(max)
Declare @sql nvarchar(max)
Declare @cnt int 
DECLARE @Counter int
SET @Counter = 1
DECLARE @RowCount INT


SET @RowCount = (SELECT COUNT(*) 
FROM (
SELECT * FROM  TABLE_LIST1
UNION
SELECT * FROM  TABLE_LIST2) data )

DROP TABLE #DB_DUMMY

CREATE TABLE #DB_DUMMY (
[TABLENAME] VARCHAR(512),
[LAST_REFRESHED] VARCHAR(533)
);

WHILE ( @Counter <= @RowCount) 
BEGIN


SELECT @tables = FinalTable, @cnt = Row_num from (
SELECT FinalTable , ROW_NUMBER() OVER(ORDER BY FinalTable DESC) AS Row_num  
FROM (
SELECT FinalTable FROM  TABLE_LIST1
UNION 
SELECT FinalTable FROM ABLE_LIST2) data 
group by FinalTable) a
where Row_num = @Counter     



--This part doesnt work
INSERT INTO #DB_DUMMY(TABLENAME,LAST_REFRESHED)
SELECT @tables , [Last Refreshed] from @tables



SET @Counter = @Counter + 1


END


exec(@sql)

Я ожидаю увидеть список имен таблиц, а также последнее обновление во временной таблице # DB_DUMMY

Ответы [ 4 ]

0 голосов
/ 28 сентября 2019

я добавляю столбец [Last Refreshed] в свои таблицы и пишу этот запрос и даю правильный ответ

DROP TABLE  IF EXISTS #DB_DUMMY

CREATE TABLE  #DB_DUMMY (
[TABLENAME] VARCHAR(512),
[LAST_REFRESHED] VARCHAR(533)
);

DECLARE @COMMAND NVARCHAR(MAX)


SELECT @COMMAND = STRING_AGG(' INSERT INTO #DB_DUMMY SELECT DISTINCT '+CHAR(39)+T.name+CHAR(39)+',['+C.name+'] FROM '+S.name+'.'+T.name + ' GO', CHAR(13)+CHAR(10))
FROM sys.all_columns C
INNER JOIN sys.tables T ON C.object_id = T.object_id
INNER JOIN sys.schemas S ON T.schema_id = S.schema_id
WHERE C.name = 'Last Refreshed'


PRINT(@COMMAND)

EXEC(@COMMAND)


SELECT * FROM #DB_DUMMY

две первые строки с IF EXISTS - это новый синтаксис в SQL Server 2017

0 голосов
/ 28 сентября 2019

Попробуйте что-то вроде этого:

declare cur cursor for Select TableName From TABLE_LIST
declare @tablename nvarchar(max)
declare @sqlstring nvarchar(max)

open cur
fetch next from cur into @tablename
while @@fetch_status=0
  begin
    set @sqlstring = 'SELECT ''' + @tablename + ''' AS ''TABLE'', [LAST_REFRESHED] FROM ' + @tablename
    exec sp_executesql @sqlstring
    fetch next from cur into @tablename
  end
close cur
deallocate cur
;

Это выходные, и у меня нет доступа к базе данных для тестирования, поэтому может потребоваться некоторая настройка.Вот скрипка с примером кода, но она возвращает только первую таблицу http://sqlfiddle.com/#!18/a5b55b/2 (я думаю, что механизм выполнения скрипки мешает курсору.)

Этот ответ основан на приведенном здесь коде: У меня один и тот же столбец в нескольких таблицах, и я хочу обновить этот столбец во всех таблицах до определенного значения.Как я могу это сделать?

Обратите внимание, что нет необходимости вести список таблиц со столбцом.Вы можете сгенерировать его динамически из INFORMATION_SCHEMA.COLUMNS

0 голосов
/ 28 сентября 2019

Другой возможный подход заключается в создании и выполнении динамического оператора (невозможно использовать переменную для имени столбца или таблицы):

Таблица:

CREATE TABLE #TableNames (
   [TableName] nvarchar(128)
)
INSERT INTO #TableNames
   ([TableName])
VALUES
   (N'Table1'),
   (N'Table2'),
   (N'Table3'),
   (N'Table4'),
   (N'Table5')

Заявление:

-- Generate statement
DECLARE @stm nvarchar(max) = N''
SELECT @stm = CONCAT(
   @stm,
   N'INSERT INTO #DB_DUMMY (TABLENAME, LAST_REFRESHED) ',
   N'SELECT ''',
   [TableName],
   N''' AS [TableName], [LastRefreshed] FROM ',
   QUOTENAME([TableName]),
   N'; '
)
FROM #TableNames

-- Execute statement
PRINT @stm
EXEC sp_executesql @stm
0 голосов
/ 28 сентября 2019

Просто предложение Вы можете использовать INSERT SELECT

  INSERT INTO #DB_DUMMY(TABLENAME,LAST_REFRESHED)
  SELECT 'TABLE_LIST1', LAST_REFRESHED 
  FROM TABLE_LIST1 
  UNION ALL
  SELECT 'TABLE_LIST2', LAST_REFRESHED 
  FROM TABLE_LIST2
  UNION ALL 
  .....
  SELECT 'TABLE_LISTN', LAST_REFRESHED 
  FROM TABLE_LISTN 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...