टी-एसक्यूएल में डेटाबेस के नाम के लिए एक चर का उपयोग कैसे करें?


123

मैं अपनी स्क्रिप्ट में कई स्थानों पर डेटाबेस नाम का उपयोग करता हूं, और मैं इसे जल्दी से बदलने में सक्षम होना चाहता हूं, इसलिए मैं कुछ इस तरह की तलाश कर रहा हूं:

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'

CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO

लेकिन यह काम नहीं करता है। तो इस कोड को लिखने का सही तरीका क्या है?

जवाबों:


135

संपूर्ण स्क्रिप्ट को एक टेम्पलेट स्ट्रिंग में रखें, {SERVERNAME} प्लेसहोल्डर्स के साथ। फिर स्ट्रिंग का उपयोग करके संपादित करें:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

और फिर इसे चलाएं

EXECUTE (@SQL_SCRIPT)

यह विश्वास करना कठिन है कि, तीन वर्षों के दौरान, किसी ने यह नहीं देखा कि मेरा कोड काम नहीं करता है !

आप EXECकई बैच नहीं कर सकते । GOएक बैच विभाजक है, टी-एसक्यूएल स्टेटमेंट नहीं। तीन अलग-अलग तारों का निर्माण करना आवश्यक है, और फिर EXECप्रतिस्थापन के बाद हर एक को।

मुझे लगता है कि एक व्यक्ति एक ही स्ट्रिंग को कई पंक्तियों में विभाजित करके "चालाक" कर सकता है GO; मैंने ADO.NET कोड में किया है।

और मुझे "SERVERNAME" शब्द कहाँ से मिला?

यहाँ कुछ कोड है जो मैंने अभी परीक्षण किया है (और जो काम करता है):

DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'

DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)

SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'

DECLARE @SQL_SCRIPT VARCHAR(MAX)

SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

2
+1 बहुत अच्छा तरीका ... आपने मुझे सिर्फ एक टन के काम से बचाया, thx ... हालाँकि यह EXECUTE (@SQL_SCRIPT) होना चाहिए, या कम से कम जो मेरे लिए काम कर रहा है।
पुन: लागू किया गया

2
हालांकि, भागने से सावधान रहने की जरूरत है।
usr

4
SYSNAMEसभी संभावित डेटाबेस नामों (और संभवतः नाम के स्रोत के आधार पर SQL इंजेक्शन को रोकने के VARCHAR(255)लिए) QUOTENAMEसे निपटने के लिए उपयोग करने की तुलना में एक अधिक उपयुक्त डेटाटाइप होगा
मार्टिन स्मिथ

1
अगर मैं CREATE SCHEMAअन्य डेटाबेस में, का उपयोग कर काम नहीं करता है USE {DBNAME}। स्कीमा गलत डेटाबेस बनाता है; /
बॉम्बेल्ट

103

आप इसके लिए sqlcmdमोड का भी उपयोग कर सकते हैं (प्रबंधन स्टूडियो में "क्वेरी" मेनू पर इसे सक्षम करें)।

:setvar dbname "TEST" 

CREATE DATABASE $(dbname)
GO
ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE $(dbname) SET RECOVERY SIMPLE 
GO

संपादित करें:

SQLCMD उपकरण के माध्यम से पैरामीटर सेट करने के लिए इस MSDN लेख की जाँच करें ।


1
यह विधि पहले से घोषित चर का उपयोग कैसे कर सकती है? "TEST" के बजाय आप @dbName जोड़ सकते हैं? मैंने कोशिश की और काम नहीं किया
syclee

1
@ साइकल एक TSQL चर? स्क्रिप्ट के सर्वर पर भेजे जाने से पहले कोई sqlcmd प्रतिस्थापन नहीं किया जाता है।
मार्टिन स्मिथ

@MartinSmith अरे, मैं एक OUTPUT कमांड के रूप में db नाम चाहता हूं। तो मैं इसे SQLCMD का उपयोग कैसे कर सकता हूं।
कुणाल कक्कड़

12

दुर्भाग्य से आप उस प्रारूप में एक चर के साथ डेटाबेस के नाम की घोषणा नहीं कर सकते।

जिसे आप पूरा करने की कोशिश कर रहे हैं, उसके लिए आपको अपने बयानों को EXEC () स्टेटमेंट में लपेटने की आवश्यकता है। तो आपके पास कुछ ऐसा होगा:

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME

फिर कॉल करो

EXECUTE(@Sql) or sp_executesql(@Sql)

sql स्ट्रिंग निष्पादित करने के लिए।


EXECएक संग्रहीत प्रक्रिया के लिए लग रहा है। इस मामले EXECUTEमें जरूरत है।
बॉब ब्लॉग

2
वास्तव में मुझे माफी मांगने की जरूरत है। यह पता चला है EXECऔर EXECUTEसमान हैं। मैंने असफल होने EXECऔर सफल होने के बाद बयान दिया EXECUTE। हालांकि स्पष्ट रूप से मेरी वास्तविक समस्या या तो असंबंधित थी।
बॉब ब्लॉगज

2
उत्पादन में ऐसा मत करो ... कभी।
मैजिक ऑक्टोपस उर्फ़

@MagicOctopusUrn में पुरानी पोस्ट और बहुत सारी टिप्पणियां अलग-अलग हैं लेकिन मुझे पता है कि क्यों नहीं? यह विशिष्ट आवश्यकता नहीं होनी चाहिए ??
हर्ष

@MagicOctopusUrn इंजेक्शन की क्षमता के कारण है?
आइजैक रीफमैन

5

आप एक तालिका बनाने के विवरण में एक चर का उपयोग नहीं कर सकते। सबसे अच्छी बात जो मैं सुझा सकता हूं वह यह है कि पूरी क्वेरी को एक स्ट्रिंग के रूप में लिखें और उस पर अमल करें।

कुछ इस तरह का प्रयास करें:

declare @query varchar(max);
set @query = 'create database TEST...';

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