SELECT один столбец из нескольких таблиц MSSQL - PullRequest
0 голосов
/ 18 марта 2019

Легкое задание доставляет мне тяжелые времена.Я хочу выбрать один столбец из разных таблиц и вставить его в таблицу результатов.По сути, очень похоже на объединение всех:

SELECT Email FROM TableA
UNION ALL
Select Email FROM TableB

и так далее ...

Однако я хочу сделать это в автоматическом режиме.Как я уже сказал, кажется, все так просто, но я спотыкаюсь об этом.Моя попытка кода:

USE MyDatabase

IF OBJECT_ID ('TEMPDB..#Selection') IS NOT NULL DROP TableA #Selection;
SELECT Name AS TableA, ROW_NUMBER() OVER ( ORDER BY (SELECT 1)) AS RowNumb
INTO #Selection
FROM Sys.TableAs AS T
WHERE NAME LIKE '%abc%'
ORDER BY 2


IF OBJECT_ID ('TEMPDB..#Result') IS NOT NULL DROP TableA #Result;
CREATE TableA #Result ( Email VARCHAR (200))

DECLARE @Counter INT 
SET @Counter = 1


WHILE @Counter <= ( SELECT MAX (RowNumb) FROM #Selection )

BEGIN

DECLARE @Table VARCHAR (100)
SET @Table = ( SELECT TableA FROM #Selection WHERE RowNumb = @Counter )

-- PRINT @Table SET @Counter = @Counter + 1 END

    INSERT INTO #Result
    SELECT Email
    FROM @Table

    SET @Counter = @Counter + 1
END

Я уверен, что кто-то быстро найдет мои ошибки.Большое спасибо за любые советы!

С уважением, М.

1 Ответ

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

Я бы (лично) пошел бы к чему-то еще как:

CREATE TABLE #Email (email nvarchar(200));

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'INSERT INTO #Email (Email)' + NCHAR(13) + NCHAR(10) +
           STUFF((SELECT NCHAR(13) + NCHAR(10) + 
                         N'UNION ALL' + NCHAR(13) + NCHAR(10) +
                         N'SELECT CONVERT(nvarchar(200),email)' + NCHAR(13) + NCHAR(10) +
                         N'FROM ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name])
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  WHERE c.[name] = N'Email'
                  FOR XML PATH(N''),TYPE).value(N'.','nvarchar(MAX)'),1,13,N'') + N';';
PRINT @SQL;
EXEC sp_executesql @SQL;

SELECT *
FROM #Email;

DROP TABLE #Email;

Это создает динамический оператор, который создает запрос UNION ALL для каждой таблицы со столбцом Email (в текущей базе данных).) и вставляет значение во временную таблицу.Затем он возвращает указанные значения из временной таблицы (а затем удаляет таблицу, поскольку я на самом деле не знаю, что вы собираетесь с ней делать).

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