SQL सर्वर का चयन करें @ निष्क्रिय?


250

मेरे Sql (2008) संग्रहित प्रोक्स में से एक में निम्नलिखित कोड है जो पूरी तरह से ठीक है:

    CREATE PROCEDURE [dbo].[Item_AddItem]
        @CustomerId uniqueidentifier,
        @Description nvarchar(100),
        @Type int,
        @Username nvarchar(100),
    AS
    BEGIN

        DECLARE @TopRelatedItemId uniqueidentifier;
        SET @TopRelatedItemId = 
        (
           SELECT top(1) RelatedItemId 
           FROM RelatedItems 
           WHERE CustomerId = @CustomerId
        ) 

        DECLARE @TempItem TABLE
        (
            ItemId uniqueidentifier,
            CustomerId uniqueidentifier,
            Description nvarchar(100),
            Type int,
            Username nvarchar(100),
            TimeStamp datetime
        );

        INSERT INTO Item
        OUTPUT INSERTED.* INTO @TempItem
        SELECT NEWID(), @CustomerId, @Description, @Type, @Username, GETDATE()

        SELECT
            ItemId,
            CustomerId,
            @TopRelatedItemId,
            Description,
            Type,
            Username,
            TimeStamp
        FROM
            @TempItem
END
GO

तो दोस्तों आप लोगों के लिए सवाल यह है कि क्या कुछ करने की संभावना है:

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

ताकि मैं अन्य निम्नलिखित कथनों में स्मृति से इस डेटा का पुन: उपयोग कर सकूं? SQL सर्वर उपरोक्त कथन के साथ एक फिट फेंकता है, हालाँकि मैं अलग-अलग वेरिएबल्स बनाना नहीं चाहता और उनमें से प्रत्येक को एक ही टेबल के विरुद्ध अलग-अलग SELECT स्टेटमेंट के माध्यम से इनिशियलाइज़ करना चाहता हूँ .... UGH !!!

एक ही तालिका के खिलाफ कई प्रश्नों के बिना लाइनों के साथ कुछ हासिल करने के बारे में कोई सुझाव?


1
"अलग-अलग चर बनाने के लिए और उनमें से प्रत्येक को एक अलग चयन कथन के माध्यम से आरंभ करने के लिए" - आपको ऐसा करने की आवश्यकता क्यों होगी? declare @t tableएक बार, और अगर आपको DELETE @TempCustomerइसे फिर से उपयोग करने की आवश्यकता है, तो इसे फिर से डालने से पहले आग
लगाइए

जवाबों:


204

आप चयन नहीं कर सकते .. इन .. एक सारणी। सबसे अच्छा आप इसे पहले बना सकते हैं, फिर इसमें सम्मिलित कर सकते हैं। आपका दूसरा स्निपेट होना चाहिए

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT INTO 
    @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

5
ध्यान देना चाहिए कि यह सीटीई के संदर्भ में भी ठीक काम करता है। Bazinga!
माइकल क्रुकलिस

4
किसी के पास इस बात का जवाब है कि कोई व्यक्ति वास्तविक अस्थायी तालिका के साथ तालिका चर में चयन क्यों नहीं कर सकता है?
KSwift87

504

यदि आप बाद में उपयोग के लिए कुछ चर प्रदान करना चाहते हैं, तो आप इन पंक्तियों के साथ एक शॉट में उन्हें कर सकते हैं:

declare @var1 int,@var2 int,@var3 int;

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition

यदि आप के बाद की बात है कि प्रकार है


1
सर्वश्रेष्ठ उत्तर imho, लेकिन परिणाम एक से अधिक होने पर क्या होता है?
कैपिटानो 666

यदि परिणाम एक से अधिक हैं, तो आपको उपलब्ध मानों में से एक मिलेगा। यह एक दिलचस्प पहेली के लिए बना सकता है! देखें mssqltips.com/sqlservertip/1888/...
Smandoli

8
किसी एकल पंक्ति का उपयोग करने के लिए क्वेरी को मजबूर करने के लिए SELECT TOP 1
एड्रियन

1
@ एड्रियन हाँ, उपरोक्त क्वेरी मानती है कि आपने एक पंक्ति चुनी है। यदि आप अधिक फैंसी तर्क चाहते हैं तो आप ऑर्डरिंग और एग्रीगेट कार्यों का उपयोग भी कर सकते हैं।
dougajmcdonald

1
यदि आप ओपी का उपयोग करने वाले डेटाबेस प्रकार का उपयोग नहीं कर रहे हैं, तो एड्रियन के अनुसार सभी टॉप 1 का समर्थन नहीं करते हैं। SQL सर्वर / MS एक्सेस उपयोग TOP, MySQL LIMIT का उपयोग करता है, और Oracle ROWNUM का उपयोग करता है। अधिक जानकारी के लिए w3schools.com/sql/sql_top.asp देखें ।
टायलर

33

तुम यह केर सकते हो:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

फिर बाद में

SELECT CustomerId FROM #tempCustomer

आपको #tempCustomer की संरचना घोषित करने की आवश्यकता नहीं है


3
@webturner उन बिंदुओं में से कोई भी सत्य नहीं है। अस्थायी तालिकाओं को खरीद के बाहर नहीं टेढ़ा किया जाता है और सारणी चर की तुलना में तालिका चर किसी भी "स्मृति केवल" नहीं हैं।
मार्टिन स्मिथ

7
जोड़ने के लिए मत भूलना DROP TABLE #tempCustomerजब एक की #tempCustomerजरूरत नहीं है अन्यथा अगले चयन में एक #tempCustomer already existsत्रुटि का कारण होगा
ViRuSTriNiTy

15

ऐसा लगता है कि आपका सिंटैक्स थोड़ा बाहर है। इसके कुछ अच्छे उदाहरण हैं

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

फिर बाद में

SELECT CustomerId FROM @TempCustomer

2

लगता है जैसे आप अस्थायी तालिकाओं चाहते हैं। http://www.sqlteam.com/article/temporary-tables

नोट करें कि #TempTable आपके SP में उपलब्ध है।

नोट ## अस्थायी सभी के लिए उपलब्ध है।


2
## प्रलोभन - जब तक कि स्वामी (निर्माता) इसे हटा नहीं देता या काट नहीं जाता
रिचर्ड द किवी

4
मुझे टेम्‍प टेबल नहीं चाहिए। अस्थायी टेबल महंगे और धीमे होते हैं। मैं थोड़े समय के लिए एक विशिष्ट रिकॉर्ड के लिए थोड़ा सा डेटा रखना चाहता हूं और इसे कई अतिरिक्त बयानों के बिना उपलब्ध करा सकता हूं। चूँकि टेबल वेरिएबल्स में स्टोर की गई खरीद के भीतर गुंजाइश होती है जिसे वे परिभाषित किया गया था, वे उस संग्रहीत डेटा कॉल के लिए टैप किए गए डेटा को संग्रहीत करने के लिए सही समाधान हैं ...
ब्लेपज़्टर

3
मैं यह भी उल्लेख करना भूल गया कि DB Azure में रहता है .... मैं अस्थायी टेबलों के प्रबंधन से बाहर एक गड़बड़ शुरू नहीं करना चाहता।
ब्लिप्ज़र

चर तालिका जाने का रास्ता है। घोषित @varTable टेबल (....)
ARLibertarian

1

मैंने आपका प्रश्न उसी समस्या के समाधान की तलाश में पाया; और जो अन्य उत्तर इंगित करने में विफल रहते हैं वह एक स्थायी रूप में अपनी प्रक्रिया के प्रत्येक निष्पादन के लिए तालिका के नाम को बदलने के लिए एक चर का उपयोग करने का एक तरीका है, अस्थायी नहीं।

अब तक मैं जो कुछ भी करता हूं वह संपूर्ण SQL कोड को चर के साथ उपयोग करने के लिए है। ऐशे ही:

declare @table_name as varchar(30)
select @table_name = CONVERT(varchar(30), getdate(), 112)
set @table_name = 'DAILY_SNAPSHOT_' + @table_name

EXEC('
        SELECT var1, var2, var3
        INTO '+@table_name+'
        FROM my_view
        WHERE string = ''Strings must use double apostrophe''
    ');

मुझे आशा है कि यह मदद करता है, लेकिन कोड बहुत बड़ा होने पर यह बोझिल हो सकता है, इसलिए यदि आपको एक बेहतर तरीका मिल गया है, तो कृपया साझा करें!


-2
"SELECT *
  INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId"

जिसका मतलब है कि एक नया @tempCustomerटेबल बनाने योग्य और ग्राहक से डेटा सम्मिलित करना। आपने पहले ही इसे घोषित कर दिया था इसलिए फिर से घोषणा करने की कोई आवश्यकता नहीं थी। साथ जाने के लिए बेहतर है

INSERT INTO @tempCustomer SELECT * FROM Customer

4
यह काम नहीं करता है। आपको अभी भी तालिका चर को पहले से घोषित करने की आवश्यकता है।
जोहान बुले डे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.