2011-11-02 1 views
10

Je veux utiliser des variables de table dans les procédures stockées, mais voici un problème. Mes tables sont très volumineuses et déclarer qu'une variable de table nécessite un long code pour écrire et déboguer.Créer @TableVariable basé sur une table de base de données existante?

Veuillez me conseiller un moyen de déclarer rapidement des variables de table, est-il possible de créer une variable de table basée sur une table existante?

Ou s'il vous plaît partager une astuce pour créer un code pour créer une variable de table.

Merci

Répondre

5

Comme discuté dans ce SO Question vous ne pouvez pas sélectionner dans une variable de table. Quand vous dites "grand", si vous voulez dire beaucoup de colonnes, la meilleure approche pour vous serait probablement d'écrire cette table comme script et de sauvegarder la définition et l'utiliser dans votre instruction Declare. Si vous voulez dire grand dans la mesure où le nombre de lignes que vous aurez dans la variable table, vous pouvez envisager d'utiliser une table temporaire que vous pouvez ensuite faire une instruction SELECT INTO pour la créer en fonction de l'original.

SELECT * INTO #tmpTable FROM srcTable 
+1

Mais qu'en est-il s'il y a un changement dans la structure de la table? – Shamim

4

clic droit sur le tableau, choisissez Script As Create.

Remplacer create table xxx par declare @xxx table.

+0

grâce, nous pouvons créer des variables de table basée sur la table existante? – haansi

+1

@haansi Ce que décrit Andomar (et ce que j'ai décrit) est comment le faire. Comme je l'ai dit dans ma réponse, vous ne pouvez pas faire une sélection pour le créer à partir d'une table existante comme vous pouvez le faire pour une table temporaire. Le script et l'utiliser pour votre déclaration est le seul moyen réel. –

0

La réponse est simple: « Non, vous ne pouvez pas créer une table variable basée sur autre table »

Mais, vous pouvez généraliser un peu en utilisant une table de type. Par exemple (note: vous pouvez ajouter de la documentation à la table de type et de colonnes, qui peut être utile pour référence future):

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]; 
Questions connexes