Создание таблицы из структуры другой таблицы без данных - PullRequest
5 голосов
/ 19 февраля 2010

Как этого достичь в SQL (MS SQL)

Спасибо

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

Например: выберите col1, col2, col3 из @table Кроме выберите col1, col2, col2 из @ table

, поэтому мой набор результатов всегда будет отличаться в зависимости от @ table

дальше я хочу использовать эту @table в CTE

с отфильтрованными данными как ( выберите col1, col2 из temptable - (создан выше) )

ниже приведен код:

    DECLARE @TABLENAME VARCHAR(200) = 'SERVICE_DELIVERY_LOCATION';
DECLARE @COLCOUNT INT ;
DECLARE @TEMPCOLNAME VARCHAR(500) ;
DECLARE @SELECTCOLUMNS VARCHAR(5000)='';
DECLARE @EXCEPTSTATEMENT VARCHAR(5000)='' ;

---------------------------------------------------------------------------------------------------
--CASE: GET COMMON_COLUMNS COLUMNS OF SOURCE AND DESTINATION TABLE
---------------------------------------------------------------------------------------------------
DECLARE @COMMON_COLUMNS TABLE( COLUMN_NAME VARCHAR(500))
INSERT  INTO @COMMON_COLUMNS 
    SELECT  SOURCE.COLUMN_NAME FROM   SCD_SOURCE.INFORMATION_SCHEMA.COLUMNS SOURCE
    INNER JOIN SCD_DESTI.INFORMATION_SCHEMA.COLUMNS DESTI ON SOURCE.COLUMN_NAME = DESTI.COLUMN_NAME


---------------------------------------------------------------------------------------------------
--CASE: GET PK COLUMNS OF SOURCE TO MAP TO DESTINATION IN CASE WHERE NEED TO DO UPDATES
---------------------------------------------------------------------------------------------------
DECLARE @PK_COLUMNS TABLE ( PK_COLUMN VARCHAR(500))
INSERT INTO @PK_COLUMNS
    SELECT KCU.COLUMN_NAME
    FROM    SCD_SOURCE.INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC  
    JOIN    SCD_SOURCE.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA  
        AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME  
        AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA  
        AND KCU.TABLE_NAME = TC.TABLE_NAME 
        AND KCU.COLUMN_NAME !=  'CREATE_DATA_CONTAINER_ID'
    WHERE TC.CONSTRAINT_TYPE IN ('PRIMARY KEY') 


SELECT  @COLCOUNT = COUNT(*) FROM @COMMON_COLUMNS

WHILE ( @COLCOUNT != 0 )
    BEGIN
        SET @TEMPCOLNAME = (SELECT TOP 1 COLUMN_NAME FROM @COMMON_COLUMNS)
        SET @SELECTCOLUMNS = @SELECTCOLUMNS + @TEMPCOLNAME + ', '
        DELETE FROM @COMMON_COLUMNS WHERE COLUMN_NAME = @TEMPCOLNAME
        SELECT  @COLCOUNT = COUNT(*) FROM @COMMON_COLUMNS
    END

SET @SELECTCOLUMNS = SUBSTRING(@SELECTCOLUMNS, 1, LEN(@SELECTCOLUMNS) - 1)

SET @EXCEPTSTATEMENT = 'SELECT ' + @SELECTCOLUMNS + ' FROM SCD_SOURCE.DBO.' + @TABLENAME + ' EXCEPT SELECT ' + @SELECTCOLUMNS + ' FROM SCD_DESTI.DBO.' + @TABLENAME
EXEC(@EXCEPTSTATEMENT)

хочет получить набор результатов последней строки в temptable

спасибо

Ответы [ 4 ]

7 голосов
/ 19 февраля 2010
SELECT TOP 0 *
INTO NewTable
FROM OriginalTable

Это скопирует структуру, но не скопирует ограничения и т. Д. Если вы хотите все, лучше всего просто сгенерировать скрипт из SSMS и изменить имена таблиц / ограничений / индексов.

Редактировать: Re: "хотите, чтобы набор результатов последней строки перешел в temptable"

Вы можете изменить последние 2 строки на:

SET @EXCEPTSTATEMENT = 'SELECT * INTO MyNewTable FROM (SELECT ' + @SELECTCOLUMNS + ' FROM SCD_SOURCE.DBO.' + @TABLENAME + ' EXCEPT SELECT ' + @SELECTCOLUMNS + ' FROM SCD_DESTI.DBO.' + @TABLENAME + ') x'
EXECUTE(@EXCEPTSTATEMENT)

Это поместит набор результатов в "реальную" таблицу;поочередно вам придется использовать глобальную временную таблицу (просто измените «MyTable» на «## MyTable»).Он не будет работать с локальной временной таблицей ("#MyTable"), поскольку область действия этого параметра будет находиться внутри оператора EXECUTE, т. Е. После EXECUTE у вас не могло быть кода, который затем запрашивал бы локальную временную таблицу, поскольку он не будетсуществуют в этой области.Следовательно, это должна быть реальная таблица или глобальная временная таблица (которая будет доступна за пределами текущей области) /

4 голосов
/ 19 февраля 2010

Откройте вашу студию управления, щелкните правой кнопкой мыши на вашем столе и создайте -> Новое окно запроса. Это сгенерирует запрос для создания точной копии вашей таблицы с ограничениями индексов и т.д ...

1 голос
/ 19 февраля 2010

Я использовал этот ответ / script раньше.

1 голос
/ 19 февраля 2010
SELECT *
INTO NewTable
FROM OriginalTable
WHERE 1 = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...