एमएस-एसक्यूएल में, मैं एक temp तालिका में कैसे शामिल करूं, और टेम्पलेट टेबल को पहली बार घोषित किए बिना एक पहचान फ़ील्ड बनाया है?


36

मुझे कुछ माध्यमिक गणना करने के लिए एक अस्थायी तालिका में डेटा का एक समूह चुनने की आवश्यकता है; इसे अधिक कुशलता से काम करने में मदद के लिए, मैं उस तालिका पर एक पहचान कॉलम रखना चाहता हूं। मुझे पता है कि मैं पहले पहचान के साथ टेबल घोषित कर सकता हूं, फिर बाकी डेटा डालें, लेकिन क्या 1 कदम में ऐसा करने का कोई तरीका है?

+1

पहचान कॉलम बातें एकाधिक उपयोगकर्ताओं के लिए संगत बनाने के। प्राथमिक कुंजी चीजों को कुशल बनाती है। अधिकतम प्रभाव के लिए दोनों का प्रयोग करें। 23 sep. 082008-09-23 20:28:18

64

थोड़ा विश्वास की हे तु:

SELECT *, IDENTITY(int) AS idcol 
    INTO #newtable 
    FROM oldtable 

http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx

  0

पुराने काम करने वाले के पास पहचान कॉलम 23 sep. 082008-09-23 20:38:39

+1

है, लेकिन निश्चित रूप से, आपके पास दो नहीं हो सकते हैं। क्वेरी 23 sep. 082008-09-23 20:54:24

  0

के भाग के रूप में पहचान कॉल का चयन न करें, अगर ऑर्डर द्वारा ऑर्डर करके और "idcol" को उसी क्रम में होने की अपेक्षा करते समय सावधान रहना चाहिए। http://support.microsoft.com/kb/273586 04 oct. 112011-10-04 18:28:36

  0

CurrentID के रूप में कास्ट (int के रूप में CurrentID) का चयन करें, यदि आपको पुराने टेक्स्ट में पहचान कॉलम 05 feb. 142014-02-05 17:58:29


-4

आईआईआरसी, INSERT INTO कमांड टेम्पलेट तालिका बनाने के लिए स्रोत तालिका की स्कीमा का उपयोग करता है। यही कारण है कि आप एक अतिरिक्त कॉलम के साथ एक टेबल बनाने की कोशिश नहीं कर सकते हैं। पहचान कॉलम आंतरिक रूप से एक जेनरेटर नामक SQL सर्वर निर्माण से बंधे होते हैं।


-3

आप मुझे नहीं पता कर एक का चयन में है, जो मक्खी क्षेत्रों आपके द्वारा चुने गए के आधार पर तालिका संरचना बनाने होगा, लेकिन हो सकता है लगता है कि यह आपके लिए एक पहचान क्षेत्र बनायेगा।

ALTER TABLE #mytable 
ADD PRIMARY KEY(KeyColumn) 

कि स्तंभ नाम के लिए एक चर नहीं ले जाएगा:


1

बातें कुशल बनाने के लिए, आप घोषणा करते हैं कि स्तंभों में से एक प्राथमिक कुंजी होने के लिए करते हैं की जरूरत है।

मेरा विश्वास करो, आप ऐसा करने से बहुत बेहतर हैं: #myTable तालिका बनाएं (या संभवतः एक डेकलेर टैबलेट @myTable), जो आपको पहचान और प्राथमिक कुंजी सीधे सेट करने की अनुमति देता है।

  0

पर निर्भर करता है तो यह आपको पसंद करना चाहिए; एक अनुक्रमित तालिका में सम्मिलित हैं (कुछ अपवादों के साथ) बी + पेड़ रखरखाव के कारण एक अनइंडेक्ड टेबल की तुलना में धीमी है; इंडेक्स को सार्थक बनाने के लिए इस ऐप में अस्थायी तालिका में पर्याप्त डेटा लोड नहीं हो सकता है। पूरी तरह से स्थिति पर निर्भर करता है, और हमारे पास 23 sep. 082008-09-23 20:58:20

  0

जानने के लिए अपर्याप्त जानकारी है, वह "चीजों को कुशल बनाने" के लिए "पहचान" चाहता है। हम निष्कर्ष निकाल सकते हैं कि वह उन आईडी तक वस्तुओं तक पहुंचना चाहता है जो पहले से मौजूद नहीं हैं। एक आईडी द्वारा सॉर्ट करना आसान है जो पहले से मौजूद नहीं है। 23 sep. 082008-09-23 21:53:05

  0

उसने कुशल परिभाषित नहीं किया है - मेरी सोच यह थी कि वह एक पहचान चाहता था जो गति के लिए नहीं, बल्कि आसानी से उपयोग के लिए। लेकिन अगर यह एक प्रदर्शन की बात है, तो मौजूदा कॉलम 23 sep. 082008-09-23 23:19:48


5

आपने टिप्पणी की: पुराने टेक्स्ट में पहचान कॉलम होने पर काम नहीं कर रहा है।

मुझे लगता है कि यह आपका जवाब है। #newtable स्वचालित रूप से पुराने प्रारूप से पहचान कॉलम प्राप्त करता है। अगले बयान चलाएं:

create table oldtable (id int not null identity(1,1), v varchar(10)) 

select * into #newtable from oldtable 

use tempdb 
GO 
sp_help #newtable 

यह आपको दिखाता है कि # न्यूटेबल में पहचान कॉलम है।

आप पहचान स्तंभ नहीं करना चाहते हैं, #newtable के निर्माण पर इस कोशिश:

select id + 1 - 1 as nid, v, IDENTITY(int) as id into #newtable 
    from oldtable 

1

अच्छा प्रश्न & मैट एक अच्छा जवाब था।वाक्य रचना पर विस्तार करने के लिए एक छोटे से एक उपयोगकर्ता निम्न चला सकते हैं यदि oldtable एक पहचान है:

SELECT col1, col2, IDENTITY(int) AS idcol 

    INTO #newtable 

    FROM oldtable 

-

होगा कि अगर oldtable जैसे कुछ पटकथा गया था:

CREATE TABLE [dbo].[oldtable] 
(
    [oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, 
    [col1] [nvarchar](50) NULL, 
    [col2] [numeric](18, 0) NULL, 
) 

Thx 4 की जानकारी इस सवाल का मुझे मदद की,

Catto


2

यदि आप वर्तमान पहचान वाले कॉलम को शामिल करना चाहते हैं, तो आप अभी भी ऐसा कर सकते हैं लेकिन आपको कॉलम को स्पष्ट रूप से सूचीबद्ध करना होगा और वर्तमान पहचान को int में डालना होगा (मान लीजिए कि यह अब एक है), जैसे:

select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID 
into #temp 
from myserver.dbo.mytable 
  0

में से एक सूचकांक यह मेरे लिए काम कर रहा है। धन्यवाद 05 feb. 142014-02-05 17:57:34


0

यदि * के बाद, आप उस शब्द को उपनाम करते हैं जो क्वेरी को दूसरी बार तोड़ रहा है ... और इसे एक नया नाम दें ... यह जादुई रूप से काम करना शुरू कर देता है।

पहचान का चयन करें (int) TempID के रूप में, *, SectionID Files_Sections से #TempSections में Fix2IDs रूप