Создать @TableVariable на основе существующей таблицы базы данных? - PullRequest
12 голосов
/ 02 ноября 2011

Я хочу использовать табличные переменные в хранимых процедурах, но здесь есть проблема.Мои таблицы очень большие, и для объявления и отладки табличной переменной необходим длинный код.

Пожалуйста, посоветуйте мне какой-нибудь способ быстрого объявления табличных переменных, возможно ли создать табличную переменную на основе существующей таблицы??

Или, пожалуйста, поделитесь советами по созданию кода для создания табличной переменной.

Спасибо

Ответы [ 3 ]

6 голосов
/ 02 ноября 2011

Как обсуждено в этом SO Вопрос , вы не можете выбрать переменную таблицы.

Когда вы говорите «большой», если вы имеете в виду большое количество столбцов, вероятно, наилучшим подходом для вас будет сценарий этой таблицы как создание, сохранение определения и использование его в вашем операторе Declare.

Если вы имеете в виду большое число строк в табличной переменной, возможно, вы захотите использовать временную таблицу, которую вы можете затем сделать с помощью оператора SELECT INTO для ее создания на основе исходного.

SELECT * INTO #tmpTable FROM srcTable
5 голосов
/ 02 ноября 2011

Щелкните правой кнопкой мыши по таблице, выберите Script As Create.

Замените create table xxx на declare @xxx table.

3 голосов
/ 17 декабря 2015

Простой ответ: «Нет, вы не можете создать таблицу переменных на основе другой таблицы»

Но вы можете обобщить немного, используя таблицу типов.Например (примечание: вы можете добавить документацию к таблице типов и столбцам, которая может быть полезна для дальнейшего использования):

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...