SQL सर्वर में गतिशील चयन शीर्ष @var


308

SQL सर्वर में लौटने के लिए मैं एक डायनामिक वैरिएबल की पंक्तियों की मात्रा कैसे निर्धारित कर सकता हूं? SQL Server 2005+ में नीचे मान्य सिंटैक्स नहीं है:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable

2
क्या आप SQL 2005 या 2008 चला रहे हैं?
ब्रायन किम

वर्तमान में SQL सर्वर 2005 चल रहा है
eddiegroves

जवाबों:


561
SELECT TOP (@count) * FROM SomeTable

यह केवल SQL 2005+ के साथ काम करेगा


52
मैं हमेशा कोष्ठकों को भी भूल जाता हूं।
जॉन शीहान

14
यह महान है! यह सब समय मुझे लगा कि मुझे गतिशील एसक्यूएल का उपयोग करना था।
लगुना

1
कोष्ठकों को न जोड़कर अपनी क्वेरी में मूर्खतापूर्ण गलती का एहसास करने के लिए और कौन है?
राघव

आपने मेरा दिन बचाया! मैंने केवल इसके लिए सभी को गतिशील क्वेरी में स्थानांतरित करने के लिए सोचा!
अल्ताफ पटेल

41

सिंटैक्स "select top (@var) ..." केवल SQL SERVER 2005+ में काम करता है। SQL 2000 के लिए, आप कर सकते हैं:

set rowcount @top

select * from sometable

set rowcount 0 

उम्मीद है की यह मदद करेगा

Oisin।

(rowcount के साथ @@ rowcount बदलने के लिए संपादित - धन्यवाद अगस्त)


1
मैंने सुना है कि यदि आपके पास मल्टी-कॉलम प्राथमिक कुंजी है तो @@ RowCount के साथ गलत पंक्ति संख्या प्राप्त करना संभव है। क्या यह सच है?
ब्रायन किम


4

गतिशील एसक्यूएल का उपयोग करना और निष्पादन कमांड के साथ इसे निष्पादित करना भी संभव है:

declare @sql  nvarchar(200), @count int
set @count = 10
set @sql = N'select top ' + cast(@count as nvarchar(4)) + ' * from table'
exec (@sql)

8
लेकिन इस दृष्टिकोण के साथ SQL इंजेक्शन हमलों से सावधान रहें (बहुत)
MadSkunk

4

या आप बस कोष्ठक में चर डालते हैं

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;

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