2009-08-24 15 views
11

मैं एक संग्रहित प्रो लिखना चाहता हूं जो पैरामीटर का उपयोग करेगा, जो तालिका का नाम होगा।डायनामिक एसक्यूएल (पैरामीटर के रूप में पासिंग टेबल नाम)

उदा:

@tablename << Parameter 

SELECT * FROM @tablename 

यह कैसे संभव है?

मैं यह लिखा:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[GetAllInterviewQuestions] 
@Alias varchar = null 
AS 
BEGIN 
Exec('Select * FROM Table as ' @Alias) 
END 

लेकिन यह @Alias ​​के पास गलत वाक्यविन्यास कहते हैं।

उत्तर

18

ठीक है, सबसे पहले आपने अपनी स्ट्रिंग से '+' छोड़ा है। काम करने के इस तरह आदर्श से दूर है, लेकिन आप क्या कर सकते हैं

DECLARE @SQL varchar(250) 
SELECT @SQL = 'SELECT * FROM ' + QuoteName(@Alias) 
Exec(@SQL) 

मैं दृढ़ता से पुनर्विचार तुम ऐसा कैसे कर सुझाव देंगे हालांकि,। जेनरेटिंग डायनामिक एसक्यूएल अक्सर एसक्यूएल इंजेक्शन भेद्यता के साथ-साथ SQL सर्वर (और अन्य डीबी) के लिए आपकी क्वेरी को संसाधित करने का सबसे अच्छा तरीका बनाने के लिए कठिन बनाता है। यदि आपके पास एक संग्रहीत प्रक्रिया है जो किसी भी तालिका को वापस कर सकती है, तो आपको वास्तव में संग्रहीत प्रक्रिया होने से वास्तव में कोई लाभ नहीं मिल रहा है क्योंकि यह अनुकूलन के तरीके में बहुत कुछ करने में सक्षम नहीं होगा, और आप बड़े पैमाने पर सुरक्षा लाभ भी नकल कर रहे हैं।

1

अक्सर, तालिका नाम को पैरामीटर करने के लिए संकेत मिलता है कि आपको अपना डेटाबेस स्कीमा फिर से सोचना चाहिए। यदि आप कई अलग-अलग तालिकाओं से साक्षात्कार के प्रश्न खींच रहे हैं, तो शायद अलग-अलग तालिकाओं के प्रश्नों के बीच अंतर करने वाले स्तंभ के साथ एक तालिका बनाने के लिए बेहतर है।

0

एसक्यूएल के अधिकांश कार्यान्वयन आपको संरचनात्मक तत्वों - तालिका नाम, कॉलम नाम, कॉलम द्वारा क्रम, आदि पैरामीटर के माध्यम से निर्दिष्ट करने की अनुमति नहीं देते हैं; आपको क्वेरी के उन पहलुओं को पैरामीटर करने के लिए गतिशील एसक्यूएल का उपयोग करना होगा।

हालांकि, एसक्यूएल को देख, तुम हो:

Exec('SELECT * FROM Table AS ' @Alias) 

निश्चित रूप से, इसका मतलब यह होगा कि कोड ही कभी एक मेज 'टेबल' कहा जाता है से चयन होगा, और आप @Alias ​​श्रेणीबद्ध करने की आवश्यकता होगी इसके साथ - और कई एसक्यूएल बोलियों में, संयोजन '||' ने संकेत दिया है:

Exec('SELECT * FROM Table AS ' || @Alias) 

यह अभी भी शायद आप क्या चाहते हैं नहीं करता है - लेकिन जब प्रक्रिया बनाई गई है यह एक सिंटैक्स त्रुटि उत्पन्न नहीं हो सकता है (लेकिन यह शायद रनटाइम पर एक त्रुटि उत्पन्न करेगा)।

4

आप इस तरह यह करना होगा: exec('select * from '[email protected]+' where...')

लेकिन सुनिश्चित करें कि आप पूरी तरह से जोखिम, SQL इंजेक्शन हमले की तरह समझते हैं। आम तौर पर, यदि डीबी अच्छी तरह डिज़ाइन किया गया है तो आपको कभी ऐसा कुछ नहीं करना चाहिए।

+2

आरक्षित शब्दों और/या तालिका नाम में रिक्त स्थान शामिल करने वाले टेबल नामों से स्वयं को बचाने के लिए स्क्वायर ब्रैकेट में तालिका नाम को लपेटना थोड़ा बेहतर है। निष्पादन ('+ @ tablename +' से चुनें * जहां ... ') –

3

तुम्हारा मतलब नहीं है

Exec('SELECT * FROM ' + @tableName) 

इसके अलावा, त्रुटि आप प्राप्त है, क्योंकि आप @Alias ​​से पहले एक + भूल गए हैं।

संबंधित मुद्दे