2009-03-19 33 views
38

कोड इस प्रकार है:गतिशील एसक्यूएल परिणाम प्रक्रिया संग्रहित

ALTER PROCEDURE dbo.pdpd_DynamicCall 
@SQLString varchar(4096) = null 

AS 

Begin 

    create TABLE #T1 (column_1 varchar(10) , column_2 varchar(100)) 

    insert into #T1 
     execute ('execute ' + @SQLString) 

    select * from #T1 

End 

समस्या यह है कि मैं अलग प्रक्रियाओं है कि वापस विभिन्न स्तंभों दे सकते हैं कॉल करना चाहते हैं। इसलिए मुझे तालिका # टी 1 सामान्य रूप से परिभाषित करना होगा। लेकिन मुझे नहीं पता कि कैसे।

किसी को भी इस समस्या पर मेरी मदद कर सकते हैं?

+1

ध्वनि में है जैसे आप संग्रहित प्रक्रियाओं का उपयोग करें और सादे पुराने parametered एसक्यूएल स्क्रिप्ट का उपयोग करने की कोशिश कर बंद कर देना चाहिए की जरूरत है। –

उत्तर

34

प्रयास करें:

SELECT into #T1 execute ('execute ' + @SQLString) 

और यह एक एसक्यूएल इंजेक्शन भेद्यता की तरह असली बदबू आती है।


सुधार (@ CarpeDiem की टिप्पणी के अनुसार):

INSERT into #T1 execute ('execute ' + @SQLString) 

भी 'execute' छोड़ देते हैं, तो एसक्यूएल स्ट्रिंग एक प्रक्रिया के अलावा कुछ

+0

कठिन स्वीकार्य उत्तर, मैं यह काम नहीं कर सकता! सबसे पहले यह शिकायत करता है कि चयन के बाद कोई * नहीं है। और जब मैं इसे शब्दों में कहें, यह शिकायत से चयन करने के लिए कोई तालिका है कि वहाँ .. चुनें * जांच निष्पादित #tmp_input ('का चयन करें 1 परीक्षण के रूप में'); >>> एसक्यूएल सर्वर डेटाबेस त्रुटि: से चुनने के लिए तालिका निर्दिष्ट करना चाहिए। SQL सर्वर 2005 पर! – ercan

+3

मुझे लगता है कि उत्तर # टी 1 निष्पादन ('execute' + @SQLString) में * INSERT * था ... –

+3

यह काम नहीं कर रहा है ... – sreejithsdev

0

यकीन है कि अगर मैं अच्छी तरह से समझते हैं, लेकिन हो सकता है आप एक स्ट्रिंग के अंदर बयान बनाएं, फिर उस पर अमल स्ट्रिंग बन सकती है नहीं? इस तरह आप जितना चाहें उतने कॉलम जोड़ सकते हैं।

+0

लेकिन, मुझे कॉलम नहीं पता, यह गतिशील है। – Dhana

31

आप गतिशील रूप से सिर्फ एक मेज को परिभाषित कर सकते है क्योंकि आप इसे गतिशील रूप से सम्मिलित कर रहे हैं, लेकिन समस्या temp तालिकाओं के दायरे के साथ है। उदाहरण के लिए, यह कोड:

DECLARE @sql varchar(max) 
SET @sql = 'CREATE TABLE #T1 (Col1 varchar(20))' 
EXEC(@sql) 
INSERT INTO #T1 (Col1) VALUES ('This will not work.') 
SELECT * FROM #T1 

त्रुटि "अमान्य ऑब्जेक्ट नाम '# T1' त्रुटि के साथ वापस आ जाएगा।" ऐसा इसलिए है क्योंकि अस्थायी तालिका # टी 1 निष्पादन कोड के ब्लॉक की तुलना में "निचले स्तर" पर बनाई गई है। आदेश को ठीक करने के लिए, एक वैश्विक अस्थायी तालिका का उपयोग करें:

DECLARE @sql varchar(max) 
SET @sql = 'CREATE TABLE ##T1 (Col1 varchar(20))' 
EXEC(@sql) 
INSERT INTO ##T1 (Col1) VALUES ('This will work.') 
SELECT * FROM ##T1 

आशा इस मदद करता है, जेसी

+0

के साथ काम करने के लिए भी प्राप्त नहीं कर सकता, इससे मदद मिली। धन्यवाद! – user219628

+2

यह है! अब मैं अपनी संग्रहीत प्रक्रिया के अंदर तालिका बना सकता हूं, नाम के साथ पारित नाम! अगर मैं 10 वोट दे सकता हूं! –

14

एक वैश्विक अस्थायी तालिका समाधान से सावधान रहें, क्योंकि यह दो उपयोगकर्ताओं को एक ही में एक ही दिनचर्या का उपयोग करता है, तो विफल हो सकता है एक वैश्विक अस्थायी तालिका के रूप में समय सभी उपयोगकर्ताओं द्वारा देखा जा सकता है ...

0
DECLARE @EmpGroup INT =3 , 
     @IsActive BIT=1 

DECLARE @tblEmpMaster AS TABLE 
     (EmpCode VARCHAR(20),EmpName VARCHAR(50),EmpAddress VARCHAR(500)) 

INSERT INTO @tblEmpMaster EXECUTE SPGetEmpList @EmpGroup,@IsActive 

SELECT * FROM @tblEmpMaster 
8

गतिशील नाम पर एक GUID के साथ एक वैश्विक अस्थायी तालिका बनाने के। फिर आप अपने कोड में, dyn sql के माध्यम से इसके साथ काम कर सकते हैं, बिना किसी चिंता के कि एक ही प्रक्रिया को उसी स्पोक को कॉल करना इसका उपयोग करेगा। जब आप न जानते हैं कि अंतर्निहित चयनित तालिका से हर बार इसे चलाता है ताकि आप एक अस्थायी तालिका स्पष्ट रूप से पहले से नहीं बनाया जा सकता है उम्मीद करना यह उपयोगी है। यानी - आप का चयन करें उपयोग करने के लिए * वाक्य रचना

DECLARE @TmpGlobalTable varchar(255) = 'SomeText_' + convert(varchar(36),NEWID()) 

-- select @TmpGlobalTable 

-- build query 
    SET @Sql = 
     'SELECT * INTO [##' + @TmpGlobalTable + '] FROM SomeTable' 
EXEC (@Sql) 
EXEC ('SELECT * FROM [##' + @TmpGlobalTable + '] ') 
EXEC ('DROP TABLE [##' + @TmpGlobalTable + ']') 
PRINT 'Dropped Table ' + @TmpGlobalTable 
+0

यदि आपके पास गतिशील कॉलम नाम हैं, तो यह तरीका है। – jbd

+0

अच्छा समाधान। तालिका नाम के चारों ओर स्क्वायर ब्रैकेट्स पर ध्यान दें: वर्च में परिवर्तित NEWID में "-" है जो अन्यथा ऑब्जेक्ट नामों में अमान्य हैं। – SebTHU

0
CREATE PROCEDURE dbo.pdpd_DynamicCall 
AS 
DECLARE @SQLString_2 NVARCHAR(4000) 
SET NOCOUNT ON 
Begin 
    --- Create global temp table 
    CREATE TABLE ##T1 (column_1 varchar(10) , column_2 varchar(100)) 

    SELECT @SQLString_2 = 'INSERT INTO ##T1(column_1, column_2) SELECT column_1 = "123", column_2 = "MUHAMMAD IMRON"' 
    SELECT @SQLString_2 = REPLACE(@SQLString_2, '"', '''') 

    EXEC SP_EXECUTESQL @SQLString_2 

    --- Test Display records 
    SELECT * FROM ##T1 

    --- Drop global temp table 
    IF OBJECT_ID('tempdb..##T1','u') IS NOT NULL 
    DROP TABLE ##T1 
End 
संबंधित मुद्दे