2011-11-02 18 views
10

Chcę używać zmiennych tabeli w procedurach przechowywanych, ale tutaj jest problem. Moje tabele są bardzo duże i deklarowanie zmiennej tabeli wymaga długiego kodu do pisania i debugowania.Utworzyć @TableVariable na podstawie istniejącej tabeli bazy danych?

Uprzejmie proszę o podanie sposobu, aby szybko zadeklarować zmienne tabeli, czy można utworzyć zmienną tabeli na podstawie istniejącej tabeli?

Lub podziel się wskazówkami, aby utworzyć kod do tworzenia zmiennej tabeli.

Dzięki

Odpowiedz

5

Jak to omówiono w tej publikacji SO Question, nie można wybrać zmiennej tabeli.

Kiedy mówisz "duży", jeśli masz na myśli wiele kolumn, najlepszym podejściem będzie prawdopodobnie skryptowanie tej tabeli jako tworzenie i zapisywanie definicji i używanie jej w oświadczeniu Deklaracji.

Jeśli masz na myśli dużą liczbę wierszy, które będziesz mieć w zmiennej tabeli, możesz rozważyć użycie tabeli tymczasowej, którą możesz następnie wykonać za pomocą instrukcji SELECT INTO, aby utworzyć ją na podstawie oryginału.

SELECT * INTO #tmpTable FROM srcTable 
+1

Ale co, jeśli nastąpi zmiana w strukturze tabeli? – Shamim

4

Kliknij prawym przyciskiem myszy tabelę, wybierz Script As Create.

Wymień create table xxx na declare @xxx table.

+0

dzięki, możemy stworzyć zmienną tabeli na podstawie istniejącej tabeli? – haansi

+1

@haansi Co opisał Andomar (i co opisałem) to jak to zrobić. Jak już powiedziałem w mojej odpowiedzi, nie można dokonać wyboru, aby utworzyć go z istniejącej tabeli, tak jak w przypadku tabeli tymczasowej. Skryptowanie i używanie go do deklaracji jest jedyną prawdziwą drogą. –

0

Prosta odpowiedź brzmi „Nie nie można utworzyć zmienną tabelę na podstawie innej tabeli”

Ale można uogólniać trochę za pomocą tabeli typów. Na przykład (uwaga: można dodać dokumentację do stołu typu i kolumn, które mogą być przydatne do wykorzystania w przyszłości):

PRINT 'type: [dbo].[foo_type]' 
PRINT ' - Check if [dbo].[foo_type] TYPE exists (and drop it if it does).' 
GO 
IF EXISTS (SELECT 1 FROM sys.types WHERE name = 'foo_type' AND is_table_type = 1 AND SCHEMA_ID('dbo') = schema_id) 
BEGIN 
    -- Create the proc 
    PRINT ' - Drop TYPE [dbo].[foo_type]'; 
    DROP TYPE [dbo].[foo_type]; 
END; 
GO 
PRINT ' - create [dbo].[foo_type] TYPE.' 
GO 
CREATE type [dbo].[foo_type] as Table 
(
     [id]     int identity(1,1) PRIMARY KEY 
     , [name]    varchar(255) NOT NULL 
     , [description]   varchar(255) 
     , numeric_data   numeric(26, 6) 
     , datetimestamp   datetime default getdate() 
     , Unique_Indicator  float unique not null default cast(getdate() as float) 
     , CHECK (Unique_Indicator > 0) 

); 
GO 
PRINT ' - done.' 
GO 


-- Adding the descriptions 
PRINT ' - Adding Type level Description' 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'describe the usage of this type.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TYPE',@level1name=N'foo_type' 
GO 
PRINT ' - Adding Column level Descriptions' 
PRINT ' - column: id' 
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID of the record...' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TYPE',@level1name=N'foo_type', @level2type=N'COLUMN',@level2name=N'ID'; 
GO 

------------------------------------------------------------------------------------------------ 
-- use the type defined above to manipulate the variable table: 

declare @foo_table foo_type; 

--insert using the default value for the for the unique indicator. 
insert into @foo_table (name, [description], numeric_data, datetimestamp) 
    values('babar', 'this is the king of the elephants', 12.5, '1931-01-01') 
     ; 

-- insert the records one by one to use the scope_identity() for the unique indicator. 
insert into @foo_table (name, [description], numeric_data, datetimestamp, Unique_Indicator) 
    values('zephyr', 'Babar''s monkey friend', 5.5, '1932-01-01', scope_identity()) 
     ; 
insert into @foo_table (name, [description], numeric_data, datetimestamp, Unique_Indicator) 
    values ('Celeste', 'Babar''s sister', 19.5, '1932-01-01', scope_identity()) 
     ; 

-- insert using a list of values 
insert into @foo_table (name, [description], numeric_data, datetimestamp, Unique_Indicator) 
    values('Babur', 'Not Babar!!!', 1483, '1983-02-14', 10) 
     , ('Mephistopheles', 'Not Babar either...', 666, '1866-01-01',11) 
     ; 

-- insert using a select 
insert into @foo_table (name, [description], numeric_data, datetimestamp, Unique_Indicator) 
    (select 'Conan', 'The Cimmerian barbarian', 850, '1932-12-01',99 union 
     select 'Robert E. Howard', 'Conan''s creator', 30, '1906-01-22', 100 
    ); 

-- check the data we inserted in the variable table. 
select * from @foo_table; 


-- Clean up the example type 
DROP TYPE [dbo].[foo_type]; 
Powiązane problemy