2011-11-02 17 views
10

मैं संग्रहित प्रक्रियाओं में तालिका चर का उपयोग करना चाहता हूं लेकिन यहां एक मुद्दा है। मेरी टेबल बहुत बड़ी हैं और टेबल वैरिएबल घोषित करने के लिए लिखने और डीबग करने के लिए एक लंबा कोड चाहिए।मौजूदा डेटाबेस तालिका के आधार पर @TableVariable बनाएँ?

कृपया मुझे तालिका चर त्वरित रूप से घोषित करने का कोई तरीका सलाह दें, क्या मौजूदा तालिका के आधार पर तालिका चर बनाना संभव है?

या तालिका चर बनाने के लिए कोड बनाने के लिए कृपया कोई टिप साझा करें।

धन्यवाद

उत्तर

5

जैसा कि इस SO Question में चर्चा की गई है, आप तालिका चर में चयन नहीं कर सकते हैं।

जब आप "बड़े" कहते हैं, यदि आप बहुत सारे कॉलम का मतलब रखते हैं, तो आपके लिए सबसे अच्छा तरीका शायद उस तालिका को स्क्रिप्ट करना होगा और परिभाषा को सहेजने और सहेजने के लिए आपके घोषणापत्र में उपयोग करना होगा।

यदि आपके पास टेबल वैरिएबल में पंक्तियों की संख्या जितनी बड़ी है, तो आप एक अस्थायी तालिका का उपयोग करने पर विचार करना चाहेंगे, जिसे आप मूल के आधार पर बनाने के लिए SELECT INTO कथन कर सकते हैं।

SELECT * INTO #tmpTable FROM srcTable 
+1

लेकिन तालिका संरचना में कोई बदलाव होने पर क्या होगा? – Shamim

4

सही तालिका क्लिक करें, Script As Create चुनें।

create table xxxdeclare @xxx table के साथ बदलें।

+0

धन्यवाद, हम मौजूदा तालिका के आधार पर तालिका वैरिएबल बना सकते हैं? – haansi

+1

@ हांसी क्या एंडोमर ने वर्णन किया (और मैंने जो वर्णन किया) यह है कि यह कैसे करें। जैसा कि मैंने अपने जवाब में कहा था, आप किसी मौजूदा तालिका से इसे बनाने के लिए चयन नहीं कर सकते जैसे आप एक temp तालिका के लिए कर सकते हैं। इसे घोषित करना और आपकी घोषणा के लिए इसका उपयोग करना एकमात्र वास्तविक तरीका है। –

0

सरल जवाब है

"नहीं आप एक चर तालिका अन्य तालिका के आधार पर नहीं बना सकते" लेकिन, आप एक प्रकार तालिका का उपयोग करके थोड़ा सामान्यीकरण कर सकते हैं। उदाहरण के लिए (ध्यान दें: प्रकार तालिका और कॉलम है, जो भविष्य में संदर्भ के लिए उपयोगी हो सकता करने के लिए प्रलेखन जोड़ सकते हैं):

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]; 
संबंधित मुद्दे