2009-04-29 13 views
141

मेरे पास गतिशील एसक्यूएल का एक टुकड़ा है जिसे मुझे निष्पादित करने की आवश्यकता है, फिर मुझे परिणाम को एक चर में स्टोर करने की आवश्यकता है।sp_executesql परिणाम को एक चर में कैसे प्राप्त करें?

मुझे पता है कि मैं sp_executesql का उपयोग कर सकता हूं लेकिन यह कैसे करना है इसके बारे में स्पष्ट उदाहरण नहीं मिल सकते हैं।

उत्तर

200

आप आउटपुट पैरामीटर हैं तो आप

DECLARE @retval int 
DECLARE @sSQL nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

DECLARE @tablename nvarchar(50) 
SELECT @tablename = N'products' 

SELECT @sSQL = N'SELECT @retvalOUT = MAX(ID) FROM ' + @tablename; 
SET @ParmDefinition = N'@retvalOUT int OUTPUT'; 

EXEC sp_executesql @sSQL, @ParmDefinition, @[email protected] OUTPUT; 

SELECT @retval; 

कर सकते हैं लेकिन आप नहीं करते हैं, और सपा संशोधित नहीं कर सकते हैं:

-- Assuming that your SP return 1 value 
create table #temptable (ID int null) 
insert into #temptable exec mysp 'Value1', 'Value2' 
select * from #temptable 

सुंदर नहीं है, लेकिन काम करता है।

+0

मेरा एसपी sp_executesql @myQuery – JohnIdol

+0

'@ retvalOUT = @ retval OUTPUT' होगा? 'Sp_executesql' का तीसरा पैरामीटर सिर्फ '@retval OUTPUT' नहीं होना चाहिए? –

+0

मुझे मिल गया! यह वैकल्पिक रूप से पैरामीटर के नाम को स्वीकार करता है। –

25
DECLARE @vi INT 
DECLARE @vQuery VARCHAR(1000) 

SET @vQuery = 'SELECT @vi= COUNT(*) FROM <TableName>' 

EXEC SP_EXECUTESQL 
     @Query = @vQuery 
     , @Params = N'@vi INT OUTPUT' 
     , @vi = @vi OUTPUT 

SELECT @vi 
+7

परिवर्तनीय viOUTPUT और viINT की घोषणा कहां है? –

+0

यह मेरे लिए काम किया।अधिक वोटों के साथ उत्तर –

+2

पैरामीटर @ vQuery ** का काम नहीं किया जाना चाहिए ** VARCHAR को NVARCHAR के रूप में घोषित नहीं किया जाना चाहिए। – eFarzad

33
DECLARE @tab AS TABLE (col VARCHAR(10), colu2 varchar(10)) 
    INSERT into @tab EXECUTE sp_executesql N'SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2' 

    SELECT * FROM @tab 
+0

मैंने पहले इस विधि का उपयोग किया है। यह केवल 'टैब' में पहले 'डालने' पर काम करता प्रतीत होता है। यदि आप 'टैब में डालने' का प्रयास करते हैं और विभिन्न एसक्यूएल के साथ एकाधिक 'execute sp_executesql' चलाते हैं, तो' टैब * से चुनें * केवल पहले निष्पादित –

+0

ओह, मेरे खराब परिणामों के परिणाम दिखाता है। मेरे दूसरे चयन में एक त्रुटि हुई, जिसका अर्थ था कि यह शून्य पंक्तियों को वापस कर रहा था। यह विधि बहुत अच्छा काम करती है, और एक temp तालिका की आवश्यकता नहीं है! –

+1

इस काम के लिए आपको SQL Server 2008 की भी आवश्यकता होगी –

3

घोषित @variable पूर्णांक

Exec @variable = proc_name

0

वापसी मान आम तौर पर "वापसी" एक परिणाम है, लेकिन सफलता वापस जाने के लिए करने के लिए इस्तेमाल नहीं कर रहे हैं (0) या कोई त्रुटि संख्या (1-65K)। उपर्युक्त सभी यह इंगित करते हैं कि sp_executesql एक मान वापस नहीं करता है, जो सही नहीं है। sp_executesql सफलता के लिए 0 और विफलता के लिए किसी अन्य नंबर पर वापस आ जाएगा।

नीचे में, @i वापस आ जाएगी 2727

DECLARE @s NVARCHAR(500) 
DECLARE @i INT; 
SET @s = 'USE [Blah]; UPDATE STATISTICS [dbo].[TableName] [NonExistantStatisticsName];'; 
EXEC @i = sys.sp_executesql @s 
SELECT @i AS 'Blah' 

SSMS इस संदेश 2727, स्तर 11, राज्य 1, पंक्ति 1 दिखाने सूचकांक 'NonExistantStaticsName' नहीं मिला होगा।

0

यह बहुत समय पहले था, इसलिए यह सुनिश्चित नहीं है कि यह अभी भी आवश्यक है, लेकिन आप यह देखने के लिए @@ ROWCOUNT चर का उपयोग कर सकते हैं कि पिछले एसक्यूएल कथन से कितनी पंक्तियां प्रभावित हुईं।

यह उपयोगी है जब उदाहरण के लिए आप एक गतिशील अद्यतन कथन बनाते हैं और इसे निष्पादन के साथ चलाते हैं। @@ ROWCOUNT दिखाएगा कि कितनी पंक्तियां अपडेट की गई थीं।

Here is the definition

1

घोषित @ValueTable टेबल ( मूल्य VARCHAR (100) )

    SELECT @sql = N'SELECT SRS_SizeSetDetails.'[email protected]_NAME+' FROM SRS_SizeSetDetails WHERE FSizeID = '''[email protected]+''' AND SRS_SizeSetID = '''[email protected]_SizeSetID+''''; 

        INSERT INTO @ValueTable 
        EXEC sp_executesql @sql; 

        SET @Value=''; 

        SET @Value = (SELECT TOP 1 Value FROM @ValueTable) 

        DELETE FROM @ValueTable 
1

आप वापस जाने के लिए 1 से अधिक मूल्य के लिए इसका उपयोग करना चाहते हैं:

DECLARE @sqlstatement2  NVARCHAR(MAX); 
DECLARE @retText   NVARCHAR(MAX); 
DECLARE @ParmDefinition  NVARCHAR(MAX); 
DECLARE @retIndex   INT = 0; 

SELECT @sqlstatement = 'SELECT @retIndexOUT=column1 @retTextOUT=column2 FROM XXX WHERE bla bla'; 

SET @ParmDefinition = N'@retIndexOUT INT OUTPUT, @retTextOUT NVARCHAR(MAX) OUTPUT'; 

exec sp_executesql @sqlstatement, @ParmDefinition, @[email protected] OUTPUT, @[email protected] OUTPUT; 

लौटे मान @retIndex और @retText

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