Создать таблицу из запроса выбора - PullRequest
1 голос
/ 03 апреля 2019

У меня есть запрос, который объединяет 7 таблиц с 852 столбцами в SQL Server 2008 R2 Express. Я пытаюсь создать новую таблицу с выводом этого запроса

Пробовал с использованием INTO, но, поскольку некоторые столбцы в таблицах имеют повторяющиеся имена, он не работает

USE VistaBI
SELECT *
INTO NewTable
FROM         dbo.Agente FULL JOIN
                      dbo.Cte ON dbo.Agente.Agente = dbo.Cte.Agente 
                      FULL JOIN
                      dbo.CteEnviarA ON dbo.Agente.Agente = dbo.CteEnviarA.Agente 
                      FULL JOIN
                      dbo.Unidad ON dbo.CteEnviarA.Unidad = dbo.Unidad.Unidad 
                      FULL JOIN
                      dbo.Venta ON dbo.Agente.Agente = dbo.Venta.Agente 
                      FULL JOIN
                      dbo.VentaD ON dbo.Agente.Agente = dbo.VentaD.Agente 
                      FULL JOIN
                      dbo.Art ON dbo.VentaD.Articulo = dbo.Art.Articulo
                      FULL JOIN 
                      dbo.Alm ON dbo.Venta.Almacen = dbo.Alm.Almacen

Существует ли способ автоматического создания таблицы вместо ввода каждого из 852 столбцов с уникальным именем и типом данных?

Ответы [ 3 ]

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

Я сделал это динамически, попробуйте этот код: имена столбцов станут именами таблиц + столбцов, поэтому имена столбцов не будут дублироваться.

DECLARE @strColumns varchar(max) = ''

SELECT @strColumns = COALESCE(@strColumns + ',', '') + A.TableName + '.' + QuoteName(Column_Name) + ' AS ' + A.Alies
FROM (
SELECT Column_Name, 'Agente' TableName, 'Agente_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'Agente' AND DATA_TYPE != 'timestamp'
UNION ALL
SELECT Column_Name, 'Cte' TableName, 'Cte_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'Cte' AND DATA_TYPE != 'timestamp'
UNION ALL
SELECT Column_Name, 'CteEnviarA' TableName, 'CteEnviarA_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'CteEnviarA' AND DATA_TYPE != 'timestamp'
UNION ALL
SELECT Column_Name, 'Unidad' TableName, 'Unidad_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'Unidad' AND DATA_TYPE != 'timestamp'
UNION ALL
SELECT Column_Name, 'Venta' TableName, 'Venta_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'Venta' AND DATA_TYPE != 'timestamp'
UNION ALL
SELECT Column_Name, 'VentaD' TableName, 'VentaD_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'VentaD' AND DATA_TYPE != 'timestamp'
UNION ALL
SELECT Column_Name, 'Art' TableName, 'Art_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'Art' AND DATA_TYPE != 'timestamp'
UNION ALL
SELECT Column_Name, 'Alm' TableName, 'Alm_' + QuoteName(Column_Name) AS Alies FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = 'Alm' AND DATA_TYPE != 'timestamp'
) AS A

SELECT @strColumns =SUBSTRING(@strColumns,2, len(@strColumns) - 1)
SELECT @strColumns


EXEC( 'SELECT 
    '+ @strColumns +' INTO ##temp
    FROM dbo.Agente 
    FULL JOIN dbo.Cte ON dbo.Agente.Agente = dbo.Cte.Agente 
    FULL JOIN dbo.CteEnviarA ON dbo.Agente.Agente = dbo.CteEnviarA.Agente 
    FULL JOIN dbo.Unidad ON dbo.CteEnviarA.Unidad = dbo.Unidad.Unidad 
    FULL JOIN dbo.Venta ON dbo.Agente.Agente = dbo.Venta.Agente 
    FULL JOIN dbo.VentaD ON dbo.Agente.Agente = dbo.VentaD.Agente 
    FULL JOIN dbo.Art ON dbo.VentaD.Articulo = dbo.Art.Articulo
    FULL JOIN dbo.Alm ON dbo.Venta.Almacen = dbo.Alm.Almacen')

SELECT * FROM ##temp
DROP TABLE ##temp
0 голосов
/ 03 апреля 2019

Что вы можете сделать, это создать таблицу изначально, а затем использовать динамические операторы alter, чтобы добавить число столбцов, которое вам нужно, например:

CREATE TABLE MYTABLE 
(
A INT,
B INT
)


DECLARE @I INT = 1, @COLNAME VARCHAR(20),@SQL VARCHAR(MAX)
WHILE (@I < 852)
BEGIN
SET @COLNAME = CAST(@I AS VARCHAR(20))


SET @SQL ='
ALTER TABLE MYTABLE
ADD [' + @COLNAME + '] VARCHAR(MAX);'
PRINT @SQL
EXEC(@SQL)
SET @I = @I + 1

END

Затем просто измените оператор вставки на:

INSERT INTO mytable
SELECT *
FROM   dbo.agente
       FULL JOIN dbo.cte
              ON dbo.agente.agente = dbo.cte.agente
       FULL JOIN dbo.cteenviara
              ON dbo.agente.agente = dbo.cteenviara.agente
       FULL JOIN dbo.unidad
              ON dbo.cteenviara.unidad = dbo.unidad.unidad
       FULL JOIN dbo.venta
              ON dbo.agente.agente = dbo.venta.agente
       FULL JOIN dbo.ventad
              ON dbo.agente.agente = dbo.ventad.agente
       FULL JOIN dbo.art
              ON dbo.ventad.articulo = dbo.art.articulo
       FULL JOIN dbo.alm
              ON dbo.venta.almacen = dbo.alm.almacen  

Это даст вам результаты с именами столбцов 1,2,3 .... и т. Д., Но это динамическое имя, которое избавит вас от необходимости вручную именовать столбцы.

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

выберите расширение имени столбца, вместо использования *

ниже, я поставил пример, используя две таблицы

select 
    a.person_id,
    a.city,
    city.city_id
into 
    mytable 
from 
    table1 a
inner join 
    city on a.city = city.city

, так что в вашем случае

SELECT table_name.col1,table_nae.col2..... use explicitly column name in selection
INTO NewTable
FROM         dbo.Agente FULL JOIN
                      dbo.Cte ON dbo.Agente.Agente = dbo.Cte.Agente 
                      FULL JOIN
                      dbo.CteEnviarA ON dbo.Agente.Agente = dbo.CteEnviarA.Agente 
                      FULL JOIN
                      dbo.Unidad ON dbo.CteEnviarA.Unidad = dbo.Unidad.Unidad 
                      FULL JOIN
                      dbo.Venta ON dbo.Agente.Agente = dbo.Venta.Agente 
                      FULL JOIN
                      dbo.VentaD ON dbo.Agente.Agente = dbo.VentaD.Agente 
                      FULL JOIN
                      dbo.Art ON dbo.VentaD.Articulo = dbo.Art.Articulo
                      FULL JOIN 
                      dbo.Alm ON dbo.Venta.Almacen = dbo.Alm.Almacen
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...