2010-02-19 17 views
5

Jak można to osiągnąć w SQL (MS SQL)Tworzenie tabeli ze struktury innej tabeli bez danych

Thanks

OK: niech mnie ugryzł jasne, co staram się acheive generuje dynamiczny select z Klauzula EXCEPT.

np: select col1, col2, Col3 z @table wyjątkiem wybierz col1, col2, col2 od @table

więc moja resultset będzie zawsze inny na podstawie @table

dodatkowych wojsk w dół i ma używać tej @table w CTE

z filteredData jak ( sELECT cOL1, col2 z Temptable - (utworzonej powyżej) )

poniżej jest kod do tej pory:

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) 

chcą resultset ostatniej linii do Temptable

dzięki

+0

Czy program musi tworzyć nowe tabele o tym samym schemacie? Jeśli jest to zrobione przez człowieka, anthares jest poprawne. – awright18

Odpowiedz

7
SELECT TOP 0 * 
INTO NewTable 
FROM OriginalTable 

Spowoduje to skopiowanie struktury, ale nie kopiować ograniczenia itp Jeśli chcesz wszystko, najlepszą rzeczą do zrobienia jest wygenerowanie skryptu z SSMS i zmiana nazw tabel/ograniczeń/indeksów.

Edit: Re: "chcą resultset ostatniej linii w Temptable"

Można zmienić ostatnie 2 linie do:

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

To postawiłoby resultset w " prawdziwy "stół; alternatywnie trzeba użyć globalnej tabeli tymczasowej (wystarczy zmienić "MyTable" na "## MyTable"). Nie działałoby to z lokalną tabelą tymczasową ("#MyTable"), której zakres znajdowałby się w instrukcji EXECUTE, tj. Po EXECUTE, nie mógłbyś mieć kodu, który zapytałby lokalną tabelę tymczasową, ponieważ nie będzie istnieje w tym zakresie. Dlatego musi to być prawdziwa tabela lub globalna tabela tymczasowa (która byłaby dostępna poza bieżącym zakresem)/

+0

Lub utwórz new_table jako select * from old_table WHERE 1 = 2 –

+2

@KMan, to nie działa na serwerze SQL – AdaTheDev

+0

Dzięki za poprawkę, dokładne wyrażenie jest jak: "wybierz * do MyNewTableName z TheOldTable gdzie 1 = 2;" - wypróbowany i przetestowany na serwerze SQL Server 2005. Kopiuje schemat bez ograniczeń. –

4

Otwórz studio zarządzania, kliknij prawym przyciskiem myszy na stole i utwórz okno -> Nowe zapytanie . To wygeneruje zapytanie do tworzenia dokładnej kopii tabeli z indeksami ograniczeń itp ...

1
SELECT * 
INTO NewTable 
FROM OriginalTable 
WHERE 1 = 0 
Powiązane problemy