2012-01-20 8 views
6

Mam kilka tabel, które już istnieją w mojej bazie danych. Niektóre z nich mają sporo kolumn.Automatyczne generowanie zdefiniowanego przez użytkownika typu tabeli zgodnej z istniejącą tabelą

Chcę wykonać niektóre procedury składowane, aby wykonać polecenie scalania z tymi tabelami. Aby to zrobić, chciałbym, aby parametr procedury składowanej był typem tabeli zdefiniowanej przez użytkownika.

Mogę wykonać skrypt dla każdej tabeli i zmodyfikować ją do instrukcji tworzenia definicji typu zdefiniowanej przez użytkownika.

Ale to, co naprawdę chciałbym, to sposób generowania zdefiniowanego przez użytkownika typu tabeli z istniejącej tabeli w mojej bazie danych. Mogę następnie dodać ten skrypt do mojej kompilacji baz danych (a następnie dodanie nowych kolumn do tabeli nie wymaga więcej niż jednej edycji).

Czy jest jakiś sposób na zrobienie tego? Czy powinienem po prostu zająć się pisaniem scenariuszy do moich tabel?

+0

Istnieją procedury przechowywane w systemie, np. 'sp_columns', które pozwoli Ci wyciągnąć wszystkie metadane. Można go masować i używać dynamicznego SQL do tworzenia sklonowanych tabel. Zakładam, że zastanawiasz się, używając 'SELECT * INTO NewTable z OldTable WHERE 42 = 13', aby utworzyć nową pustą tabelę o takiej samej strukturze jak istniejąca tabela, ale bez wierszy. – HABO

+1

@ user92546 - "Tabela" i "typ tabeli zdefiniowany przez użytkownika" to nie to samo. – MatBailie

Odpowiedz

3

W SQL Server Management Studio można kliknąć prawym przyciskiem myszy bazę danych, a pod TASKS wybrać skrypt bazy danych. Wybierz tylko tabele, a następnie tabele, które Cię interesują.

To nie daje ci jednego miejsca na wszystko, co chcesz, ale może szybko i łatwo zapisać wiele tabel. A następnie pozwól, aby trochę znaleźć i zastąpić, aby uzyskać to, czego potrzebujesz.

1

havn't próbował tego, ale wiem, że to działa na stołach temp:

SELECT * 
INTO NewTable 
FROM OldTable 
WHERE FALSE 

jednak uważać, że kopiuje wszystko, czego potrzeba, to nie przyniesie całej żadnych kluczy, indeksów lub zezwoleń.

edycja: Dzięki za cynk user92546

+1

Nie trzeba "TRUNCATE", jeśli nie przenosisz żadnych wierszy. Po prostu dodaj klauzulę "WHERE", która nigdy nie dostarcza prawdy, np. 'GDZIE 'Kongres' =" Postęp ". – HABO

+1

Przeczytaj uważnie to pytanie. OP jest po definicji tabeli * skrypcie *, a nie po tabeli. Mówiąc dokładniej, skrypt powinien być w końcu skryptem typu * UDT *, ale w każdym przypadku powinien to być * skrypt *. –

+0

@Andriy - jesteś dokładnie poprawny. Większość odpowiedzi pokazuje, jak wypisać tabelę ... – Vaccano

1

nigdy nie wiedziałem, że kreator do generowania skryptów jak ten Dems mówi o ich odpowiedzi bazy danych. I wydaje się bardziej uniwersalną metodą niż ta, z której korzystałem, ponieważ kreator umożliwia generowanie skryptów dla różnych typów obiektów za jednym razem.

Mimo to, wydaje mi się, że podzielę się moją, ponieważ wydaje mi się nieco prostsza i jest bardzo przydatna, gdy trzeba tylko skryptować obiekty tego samego typu, takie jak tylko tabele.

Więc tu idzie (specjalnie dla tabel):

  1. Otwarte Object Explorer (F8) i podłączyć go do instancji serwera docelowego.

  2. Rozwiń pozycję o nazwie Databases.

  3. Rozwiń pozycję z nazwą bazy danych.

  4. Kliknij pozycję Tabele.

  5. Szczegóły odkrytego obiektu Explorer (F7). Powinien teraz wyświetlić listę tabel użytkowników.

  6. Korzystanie ze standardowych metod Windows wyboru wielu obiektów (np. Ctrl + kliknięcie), wybierz tabele, które chcesz skryptować.

  7. prawym przyciskiem myszy na dowolny z zaznaczonych elementów i wybierz Script tabeli jako ▸, a następnie wybrać rodzaj scenariusza i gdzie go zapisać.

Kiedy trzeba skrypt różne typy obiektów, należy przejść do innego folderu „” Object Explorer zamiast tabelach, na przykład dla procedur przechowywanych będzie to Programowalność \ Zapisane procedury.

1

Potrzebuję tego samego od czasu do czasu. Oto mały skrypt, który razem wziąłem. To trochę szorstkie i nie ufałbym temu z mojego życia, ale działa całkiem dobrze dla mojej sprawy. Nie zapisuje kluczy, ale mój scenariusz nie jest konieczny. Jestem na SQL 2012, więc nie jestem całkowicie pewien, że to zadziała tak jak w SQL 2008. Nie testowałem tego dla niektórych bardziej "egzotycznych" typów, takich jak geometry, geography i przyjaciół, ponieważ nigdy nie potrzebowałem Użyj ich.

declare 
    @tablename nvarchar(50)='Users', 
    @schemaname nvarchar(50)='dbo', 
    @sql nvarchar(max)=N''; 

select @sql += N',' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'[' + c.COLUMN_NAME + N'] [' + DATA_TYPE + N']' 
    + case when c.CHARACTER_MAXIMUM_LENGTH is not null then N'(' + case c.CHARACTER_MAXIMUM_LENGTH when -1 then 'max' else cast(c.CHARACTER_MAXIMUM_LENGTH as nvarchar(10)) end + N')' else N'' end 
    + case when c.DATA_TYPE = N'numeric' then N'('+CAST(NUMERIC_PRECISION as nvarchar(10))+N', '+CAST(NUMERIC_SCALE as nvarchar(10))+N')' else N'' end 
    + case when c.is_nullable <> N'NO' then N' NULL' else N' NOT NULL'end 
from INFORMATION_SCHEMA.COLUMNS c 
where TABLE_NAME = @tablename AND TABLE_SCHEMA = @schemaname 
order by ORDINAL_POSITION; 

set @sql = stuff(@sql, 1, 1, N'CREATE TYPE [' + @schemaname + N'].[tab_' + @tablename + N'] AS TABLE(') 
    + nchar(13) + nchar(10) + ')' + nchar(13) + nchar(10) + 'GO'; 
set @sql += nchar(13) + nchar(10) + '--GRANT EXEC ON TYPE::[' + @schemaname + N'].[tab_' + @tablename + N'] TO [User];' 
    + nchar(13) + nchar(10) + '--GO'; 

print @sql 
-- If you're happy with the sql, you can pass it to sp_executesql to create your type 
-- exec sp_executesql @sql; 
Powiązane problemy