我想在存儲過程中使用表變量,但這是一個問題。我的表非常大,聲明一個表變量也需要長代碼來編寫和調試。基於現有的數據庫表創建@TableVariable?
請告訴我一些快速聲明表變量的方法,是否可以基於現有表創建表變量?
或者請分享任何提示以創建用於創建表變量的代碼。
感謝
我想在存儲過程中使用表變量,但這是一個問題。我的表非常大,聲明一個表變量也需要長代碼來編寫和調試。基於現有的數據庫表創建@TableVariable?
請告訴我一些快速聲明表變量的方法,是否可以基於現有表創建表變量?
或者請分享任何提示以創建用於創建表變量的代碼。
感謝
正如在SO Question中討論的那樣,你不能選擇一個表變量。
當你說「大」時,如果你的意思是很多列,最好的方法可能是將該表腳本編寫爲create並保存定義並在Declare語句中使用它。
如果您的意思是表中的變量的行數很大,您可能需要考慮使用臨時表,然後您可以使用SELECT INTO
語句來創建基於原始表的表。
SELECT * INTO #tmpTable FROM srcTable
右鍵單擊表格,選擇Script As Create
。
將create table xxx
替換爲declare @xxx table
。
感謝,我們可以創建基於現有的表的表變量? – haansi
@ haansi Andomar所描述的(以及我所描述的)是如何去做的。正如我在我的回答中所說的,您不能像選擇臨時表一樣從現有表中進行選擇。編寫腳本並將其用於聲明是唯一真正的方法。 –
簡單的答案是「不,你不能創建一個變量表基於其他表」
但是,你可以通過使用類型表概括了一下。 例如(注意:您可以添加文件的類型表和列,它可以供將來參考用):
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];
但是如果表格結構發生變化呢? – Shamim