डायनामिक sql के साथ निर्दिष्ट डेटाबेस में दृश्य बनाएं?


16

मैं एक गतिशील sql को छोड़ने और विभिन्न डेटाबेस में दृश्य बनाने के लिए लिख रहा हूं।

इसलिए मैंने लिखा:

set @CreateViewStatement = 
                '
                USE ['+ @DB +'];
                CREATE VIEW [dbo].[MyTable]
                AS

                SELECT ........something
exec (@CreateViewStatement)

यह मुझे त्रुटि देता है:

'क्रिएट व्यू' एक क्वेरी बैच में पहला स्टेटमेंट होना चाहिए।

यदि मैं USE DATABASE कथन को हटाता हूं तो यह ठीक काम करता है, लेकिन तब डेटाबेस अब निर्दिष्ट नहीं होता है ...।

इस समस्या का समाधान किस प्रकार से किया जा सकता है?

जवाबों:


25

आप नेस्टेड EXECकॉल का उपयोग कर सकते हैं । डेटाबेस संदर्भ USEचाइल्ड बैच के लिए बनी रहती है।

DECLARE @DB SYSNAME

SET @DB = 'tempdb'

DECLARE @CreateViewStatement NVARCHAR(MAX) 
SET @CreateViewStatement = '
      USE '+ QUOTENAME(@DB) +';
      EXEC(''
             CREATE VIEW [dbo].[MyTable] AS
             SELECT 1 AS [Foo]
      '')

                          '
EXEC (@CreateViewStatement)

1
+1 - यदि आप एसएमओ का उपयोग करते हुए विचारों को स्क्रिप्ट करते हैं तो फ्रेमवर्क यह कैसे करता है - प्रतिबंध के चारों ओर पाने के लिए परिभाषाएँ गतिशील SQL में निष्पादित की जाती हैं
JNK

1
@KingChan - आप दोनों को एफवाईओ और स्वीकार कर सकते हैं, FYI;)
JNK

@JNK +1 बेशक ~ :)
किंग चान

निश्चित रूप से काम किया !! हालांकि मैं इसे इस्तेमाल किया है, नेस्टेड क्वेरी के अंदर कई चर wih तो मैं एक सिरदर्द था बोली से निपटने के कारण! महान समाधान हालांकि!

आप एक नायक हो। तुम्हारे बाद मेरे पहले जन्म के बच्चे का नाम होगा।
जेन्स

-1

इस मामले में भाग लेने के बाद एक तरह से मैंने उपयोग कथन के बाद GO को रखा है।

set @CreateViewStatement = 
'
  USE ['+ @DB +']; GO
  CREATE VIEW [dbo].[MyTable]
  AS

  SELECT ........something'
exec (@CreateViewStatement)

बस आपको पता है, GO क़ानून क्रियान्वयन में नहीं चलेगा
किंग चान

2
यह गतिशील SQL के संदर्भ में काम नहीं करेगा। GOक्लाइंट टूल्स में एक टीएसक्यूएल कीवर्ड नहीं एक बैच सीमांकक है।
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.