2009-06-01 9 views
52

क्या एक चर के पार एक चर को बनाए रखने का कोई तरीका है?क्या एक चर के पार एक चर को बनाए रखने का कोई तरीका है?

Declare @bob as varchar(50); 
Set @bob = 'SweetDB'; 
GO 
USE @bob --- see note below 
GO 
INSERT INTO @bob.[dbo].[ProjectVersion] ([DB_Name], [Script]) VALUES (@bob,'1.2') 

'का उपयोग @bob' लाइन के लिए इस SO प्रश्न देखें।

+0

क्यों आप ऐसा करेंगे डीबी नाम के साथ तालिका के नाम को अर्हता प्राप्त करने की आवश्यकता है?मुझे लगता है कि इस से पहले एक समान सवाल पूछा गया था। – shahkalpesh

+0

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

+0

वास्तविक स्क्रिप्ट 4 अलग-अलग डेटाबेस एकीकृत करती है। मैंने dbName1, dbName2, dbName3, और dbName4 को खोजने और बदलने के लिए निर्देशों पर टिप्पणी की है। मैंने सोचा कि क्लाइंट के लिए चार चर सेट करने के लिए यह कम त्रुटि प्रवण होगी। – NitroxDM

उत्तर

25

go कमांड कोड को अलग बैचों में विभाजित करने के लिए उपयोग किया जाता है। यदि यह वही है जो आप करना चाहते हैं, तो आपको इसका उपयोग करना चाहिए, लेकिन इसका मतलब है कि बैच वास्तव में अलग हैं, और आप उनके बीच चर साझा नहीं कर सकते हैं।

आपके मामले में समाधान सरल है; आप केवल go कथन हटा सकते हैं, उन्हें उस कोड में आवश्यक नहीं है।

साइड नोट: आप use कथन में एक चर का उपयोग नहीं कर सकते हैं, यह डेटाबेस का नाम होना चाहिए।

+0

कुछ एसक्यूएल स्टेटमेंट्स ब्लॉक (गो स्टेटमेंट्स के बीच क्षेत्र) में पहला बयान होना चाहिए। उदाहरण के लिए: प्रक्रिया बनाएं या फ़ंक्शन बनाना किसी अन्य कथन से पहले होना चाहिए - या तो स्क्रिप्ट के शीर्ष पर या तुरंत गो स्टेटमेंट के बाद (नोट: व्हाइट स्टेटस और टिप्पणियों को इन कथनों से पहले अनुमति दी जाती है)। स्क्रिप्ट चलाते समय जहां ऐसे तर्क अन्य तर्क के बाद होना चाहिए, तो जीओ विवरण आवश्यक हैं। लेकिन मुझे इस बात से सहमत होना चाहिए कि ज्यादातर मामलों में, जीओ स्टेटमेंट को हटाया जा सकता है। – Zarepheth

+0

@Zarepheth: अच्छा बिंदु। इस विशिष्ट कोड में इसकी आवश्यकता नहीं है, लेकिन यह जानना उपयोगी है कि कुछ मामलों में उनकी आवश्यकता हो सकती है। – Guffa

+1

डाउनवोट क्यों? यदि आप यह नहीं समझते कि यह क्या है जो आपको लगता है कि गलत है, तो यह उत्तर में सुधार नहीं कर सकता है। – Guffa

1

सुनिश्चित नहीं हैं, अगर यह मदद करता है

declare @s varchar(50) 
set @s='Northwind' 

declare @t nvarchar(100) 
set @t = 'select * from ' + @s + '.[dbo].[Customers]' 

execute sp_executesql @t
84

अस्थायी तालिका का उपयोग करें:

CREATE TABLE #variables 
    (
    VarName VARCHAR(20) PRIMARY KEY, 
    Value VARCHAR(255) 
    ) 
GO 

Insert into #variables Select 'Bob', 'SweetDB' 
GO 

Select Value From #variables Where VarName = 'Bob' 
GO 

DROP TABLE #variables 
go 
+10

महान उत्तर ... आपने वास्तव में एक काम देने के बजाय पूछे गए प्रश्न का उत्तर दिया। –

2

आप गतिशील एसक्यूएल इस्तेमाल कर सकते हैं, बस इस (100% के साथ सुरक्षा जोखिम पर यकीन है कि बारे में पता होना सही सिंटेक्स)

घोषित @bob nvarchar (50)

declare @sql nvarchar(max) 
set @bob='SweetDB' 
set @sql = 'Use ' + @bob 

execute sp_executesql @sql 
+0

मुझे पता है कि यह एक पुराना जवाब है, लेकिन एक खोज में अच्छी तरह से आ सकता है। जब कथन निष्पादित और नियंत्रण कॉलिंग दिनचर्या पर वापस कर दिया जाता है, तो आप अभी भी उस डेटाबेस का उपयोग करेंगे जो आप गतिशील "उपयोग" कथन को निष्पादित करने से पहले थे। इसलिए इसे वर्तमान डेटाबेस को वास्तव में बदलने के तरीके के रूप में भ्रमित नहीं किया जाना चाहिए। – Storm

12

मैं इस सवाल Global Variables with GO

कौन सा आप मूल रूप से और साथ ही करना चाहता था कि क्या करना है में सक्षम होने का अतिरिक्त लाभ है से this जवाब पसंद करते हैं।

चेतावनी यह है कि आपको SQLCMD मोड (क्वेरी-> SQLCMD के तहत) चालू करने या सभी क्वेरी विंडो (उपकरण-> विकल्प फिर क्वेरी परिणाम-> डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से चालू करने की आवश्यकता है, SQLCMD में नए प्रश्न खोलें मोड)

तो फिर तुम कोड निम्न प्रकार उपयोग कर सकते हैं (पूरी तरह से Oscar E. Fraxedas Tormo से है कि एक ही जवाब से बंद फट)

--Declare the variable 
:setvar MYDATABASE master 
--Use the variable 
USE $(MYDATABASE); 
SELECT * FROM [dbo].[refresh_indexes] 
GO 
--Use again after a GO 
SELECT * from $(MYDATABASE).[dbo].[refresh_indexes]; 
GO 
+0

मैं क्वेरी आउटपुट को SQLCMD मोड में किसी अन्य फ़ाइल (: आउट फ़ाइल नाम) पर रीडायरेक्ट कर रहा था, और आउटपुट को उस फ़ाइल में फ़्लश करने के लिए जो आपको गो को निष्पादित करने के लिए है, इसलिए यह: उस स्थिति में सामान्य चर को प्रतिस्थापित करने के लिए सेटवर सिंटैक्स आवश्यक है चीजों को बैचों में विभाजित करने के लिए मजबूर किया गया है। – Anssssss

0

आप एसक्यूएल सर्वर आप कर सकते हैं का उपयोग कर रहे हैं, तो जैसे पूरे स्क्रिप्ट के लिए सेटअप वैश्विक चर:

:setvar sourceDB "lalalallalal" 

और के रूप में स्क्रिप्ट में बाद में उपयोग करें:

$(sourceDB) 

सुनिश्चित करें SQLCMD मोड सर्वर प्रबंधन Studi में पर है, तो आप उस शीर्ष मेनू के माध्यम से क्वेरी क्लिक करें और पर SQLCMD मोड को चालू कर सकते हैं।

अधिक विषय पर यहां पाया जा सकता है: MS Documentation

1

अस्थायी तालिकाओं GO बयानों से अधिक बनाए रखा जाता है, इसलिए ...

SELECT 'value1' as variable1, 'mydatabasename' as DbName INTO #TMP 

-- get a variable from the temp table 
DECLARE @dbName VARCHAR(10) = (select top 1 #TMP.DbName from #TMP) 
EXEC ('USE ' + @dbName) 
GO 

-- get another variable from the temp table 
DECLARE @value1 VARCHAR(10) = (select top 1 #TMP.variable1 from #TMP) 

DROP TABLE #TMP 

यह बहुत नहीं है, लेकिन यह काम करता है

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