Как создать процедуру SQL для объединения таблиц из растущего списка таблиц в SQLserver - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно объединить информацию из нескольких таблиц в одну таблицу.Проблема в том, что создаются новые таблицы, и я не могу контролировать, когда они создаются или как они называются, кроме начальной части имени.

Мне бы понравилось, если бы это сработало:

Select t.name
into #aReading
from sys.tables as t
where t.name like 'Fast_a%'

Select *
from (Select name from #aReading)

Это работает, но постоянно нужны новые таблицы

Insert (col1, col2) into TestTable

Select x.* from (col1,col2
from test1

union

Select col1,col2
from test1_01022019

union
Select col1,col2
from test1_09122019 ) x 

Я все еще изучаю SQL и не очень хорошо разбираюсь с While, но подумал, что это может быть ответом.

1 Ответ

1 голос
/ 11 июля 2019

Вот пример динамического SQL (например, создайте запрос как строку, а затем используйте встроенную процедуру sp_executesql для выполнения запроса).

В этом примере используются STUFF и FOR XML PATH ('') , чтобы объединить несколько запросов вместе и вставлять 'UNION' между каждым.

DECLARE @sql NVARCHAR(MAX) = 'INSERT INTO TestTable (col1, col2) '

SELECT @sql += STUFF(
    (SELECT ' UNION SELECT col1, col2 FROM ' + t.name
    FROM sys.tables as t
    WHERE t.name like 'Fast_a%'
    FOR XML PATH('')), 1, 7, '')

EXEC sp_executesql @sql

Итак, для этой схемы:

CREATE TABLE fast_a1 (col1 INT, col2 INT)
CREATE TABLE fast_a2 (col1 INT, col2 INT)
CREATE TABLE fast_aasdf (col1 INT, col2 INT)
CREATE TABLE TestTable (col1 INT, col2 INT)

Создает этот динамический запрос:

INSERT INTO TestTable (col1, col2) 
SELECT col1, col2 FROM fast_a1 
UNION 
SELECT col1, col2 FROM fast_a2 
UNION 
SELECT col1, col2 FROM fast_aasdf

Edit:

Лиз, запустите эти операторы ( или вот скрипту SQL ) последовательно, и вы увидите, что они вставляют данные:

CREATE TABLE fast_a1 (col1 INT, col2 INT);
CREATE TABLE fast_a2 (col1 INT, col2 INT);
CREATE TABLE fast_aasdf (col1 INT, col2 INT);
CREATE TABLE TestTable (col1 INT, col2 INT);

INSERT INTO dbo.fast_a1 VALUES (1, 1);
INSERT INTO dbo.fast_a2 VALUES (2, 2);
INSERT INTO dbo.fast_aasdf VALUES (3, 3);

DECLARE @sql NVARCHAR(MAX) = 'INSERT INTO TestTable (col1, col2) '

SELECT @sql += STUFF(
    (SELECT ' UNION SELECT col1, col2 FROM ' + t.name
    FROM sys.tables as t
    WHERE t.name like 'Fast_a%'
    FOR XML PATH('')), 1, 7, '')

EXEC sp_executesql @sql

SELECT * FROM dbo.TestTable

Возвращает:

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