none
[SQL] Memorizzare in una variabile output di una query dinamica RRS feed

  • Domanda

  • Ciao a tutti,

    ho un problema che non riesco a risolvere, eppure la cosa mi sembra banale.

    Con una query dinamica tiro fuori la SOMMA delle rows di due tabelle differenti (presenti su due linked server) e fin qui tutto funziona.

    Vorrei però memorizzare l'output in una variabile e poi stamparla a video. Qui non funziona, nel senso che a video viene stampato sempre 0, ovvero il valore a cui viene inizializzata la variabile. La query però restituisce un valore ben diverso da 0.

    Vi riporto il codice:

    declare @sql nvarchar(4000)


    declare @db varchar(20)

    declare @countrows float

    set @countrows = 0

    set @db='test'

    select @sql =  N'select SUM(tot) from ( select count(1) as tot from linked01.[' + @db + '].dbo.Table UNION (select count(1) as tot from linked02.[' + @db + '].dbo.Table) ) as A' 


    exec sp_executesql @sql, N'@countrows float OUT', @countrows=@countrows OUT


    print @countrows

    Come potete vedere la tabella è sempre la stessa ma si trova su due db distinti con lo stesso nome ognuno su un server diverso (ho creato dei linked server).

    Spero che qualcuno riesca a darmi una mano!!

    Grazie!

    giovedì 23 agosto 2012 12:56

Risposte

  • Ok grazie,

    sono riuscito a risolvere. In realtà nella query iniziale (@sql) dovevo inserire la variabile di output (ES: @countrows = ...)!

    • Contrassegnato come risposta Anca Popa martedì 28 agosto 2012 06:15
    lunedì 27 agosto 2012 08:33

Tutte le risposte

  • Nessuno riesce ad aiutarmi?!
    venerdì 24 agosto 2012 06:51
  • salve,

    non mi pare corretto l'utilizzo dei parametri nella gestione di sp_executesql... per la sua sinossi vedi http://msdn.microsoft.com/it-it/library/ms188001.aspx

    comunque, ad esempio, una corretta formulazione potrebbe assomigliare a 

    USE pubs;
    GO
    SELECT SUM(v.[Value])
    FROM (
    	SELECT SUM(t.price * s.qty) AS [value]
    		FROM dbo.sales s
    		JOIN dbo.titles t ON t.title_id = s.title_id
    		WHERE s.stor_id = 7131
    	UNION 
    	SELECT SUM(t.price * s.qty) AS [value]
    		FROM dbo.sales s
    		JOIN dbo.titles t ON t.title_id = s.title_id
    		WHERE s.stor_id = 8042
    	) v;
    GO
    DECLARE @rCount decimal(18,4) = 0;
    DECLARE @cmd nvarchar(2000);
    DECLARE @ParmDefinition nvarchar(500);
    SET @cmd = 
    'SELECT @rCount = SUM(v.[Value])
    FROM (
    	SELECT SUM(t.price * s.qty) AS [value]
    		FROM dbo.sales s
    		JOIN dbo.titles t ON t.title_id = s.title_id
    		WHERE s.stor_id = 7131
    	UNION 
    	SELECT SUM(t.price * s.qty) AS [value]
    		FROM dbo.sales s
    		JOIN dbo.titles t ON t.title_id = s.title_id
    		WHERE s.stor_id = 8042
    	) v;'
    
    SET @ParmDefinition = '@rCount decimal(18,4) OUTPUT';
    EXECUTE sp_executesql @cmd, @ParmDefinition, @rCount = @rCount OUTPUT;
    SELECT @rCount AS [Valore Ricercato];
    --<-------
    
    ---------------------
    2632,15
    
    (1 row(s) affected)
    
    Valore Ricercato
    ---------------------------------------
    2632.1500
    
    saluti

    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    sabato 25 agosto 2012 01:37
    Moderatore
  • Ok grazie,

    sono riuscito a risolvere. In realtà nella query iniziale (@sql) dovevo inserire la variabile di output (ES: @countrows = ...)!

    • Contrassegnato come risposta Anca Popa martedì 28 agosto 2012 06:15
    lunedì 27 agosto 2012 08:33