2012-06-19 18 views
7

यह एक आसान जवाब लेकिन मैं बहुत लंबे समय के लिए यह घूर किया गया है हो सकता है ...सरल गतिशील TSQL क्वेरी सिंटैक्स

मेरे पास निम्न क्वेरी कि एक चर नाम और मायने रखता है के रूप में एक संग्रहीत प्रक्रिया इनपुट पैरामीटर लेता है उस तालिका में रिकॉर्ड। मैं गतिशील कथन (@toStartStr) के परिणामों को एक चर (@toStart) में पुनर्प्राप्त करना चाहता हूं।

-- @tempTableName = SProc input parameter 
DECLARE @toStartStr nvarchar(150); 
DECLARE @toStart int; 
SET @toStartStr = 'SELECT @toStart = COUNT(ID) FROM ' + @tempTableName; 
EXEC(@toStartStr); 

अभी, एक त्रुटि पता चलता है कि @toStart स्ट्रिंग का चयन साथ concatenated नहीं किया जा सकता है, लेकिन यह मैं क्या चाहते का सार है। क्या कोई देख सकता है कि मैं क्या गलत कर रहा हूं? या एक विकल्प का सुझाव है? एफवाईआई एसक्यूएल 2008 आर 2। धन्यवाद।

उत्तर

11
DECLARE @sql NVARCHAR(255); 

DECLARE @toStart INT; 

SET @sql = N'SELECT @toStart = COUNT(ID) FROM ' + QUOTENAME(@tempTableName); 

EXEC sp_executesql @sql, N'@toStart INT OUTPUT', @toStart OUTPUT; 

PRINT @toStart; 

लेकिन वहाँ यह करने के लिए एक काफी आसान और कारगर तरीका है, यदि आप वर्तमान अनदेखी में उड़ान लेनदेन (और आप SQL सर्वर 2005 या बेहतर उपयोग कर रहे हैं के साथ ठीक हैं - संस्करण जब निर्दिष्ट करें सवाल पूछ रही है!)।

DECLARE @toStart INT; 

SELECT @toStart = SUM(rows) 
    FROM sys.partitions 
    WHERE [object_id] = OBJECT_ID(@tempTableName) 
    AND index_id IN (0,1); 

PRINT @toStart; 
बस संपूर्णता के लिए

, यहाँ एसक्यूएल सर्वर 2000, जो भी किसी भी विशेषाधिकार की आवश्यकता नहीं है के लिए एक समाधान है (बस से कनेक्ट करने और जनता के सदस्य):

DECLARE @toStart INT; 

SELECT @toStart = [rows] 
    FROM sysindexes 
    WHERE id = OBJECT_ID(@tempTableName) 
    AND indid IN (0,1); 

PRINT @toStart; 

कहा, यदि आप यह निर्धारित करने के लिए एक गणना का उपयोग कर रहा है कि अगली आईडी क्या हो सकती है, या ऐसा कुछ, मुझे लगता है कि आप इस गलत तरीके से आ रहे हैं, क्योंकि पंक्तियों को हटाया जा सकता है और यदि रोलबैक के कारण पहचान कॉलम मान छोड़े जा सकते हैं।

+0

यह हमेशा सत्य नहीं है कि आप ** sa ** उपयोगकर्ता हैं। मुझे लगता है कि इस क्वेरी को निष्पादित करने के लिए व्यवस्थापक अधिकारों की आवश्यकता है। सही? – Pankaj

+0

नहीं, मैंने अभी एक ऐसे सिस्टम पर परीक्षण किया जहां मेरे पास व्यवस्थापकीय अधिकार नहीं हैं और यह ठीक चलता है। – JNK

+0

@ कानावी नहीं, sys.partitions देखने के लिए व्यवस्थापक अधिकारों की आवश्यकता नहीं है। कोड को हटाने के लिए कहने से पहले क्या आपने इसे आजमाया था? –