2016-05-07 3 views
-1

Das ist, was ich versucht und bekam einen FehlerWie die MAX Zahl und MIN zählen aus einer dynamischen Tabelle erhalten

Msg 137, Ebene 15, Status 1, Zeile 1
muss die skalare Variable deklarieren " @MAXCount“

Code:

DECLARE @TempTable NVARCHAR(MAX) 
DECLARE @MAXCount VARCHAR(10) 
DECLARE @MINCount VARCHAR(10) 
DECLARE @SQLSelect NVARCHAR(MAX) 

SET @TempTable = 'Test_'+CONVERT(VARCHAR(10),@@SPID) 

SET @SQLSelect = 'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) FROM Work_Tables.dbo.'[email protected]+' (NOLOCK)' 

EXEC SP_EXECUTESQL @SQLSelect 

Antwort

0

Sie müssen Variablen wie OUTPUT Parameter übergeben:

DECLARE @TempTable NVARCHAR(MAX) = 'Test_'+ '1'; -- CONVERT(VARCHAR(10),@@SPID) 
DECLARE @MAXCount VARCHAR(10); 
DECLARE @MINCount VARCHAR(10); 
DECLARE @SQLSelect NVARCHAR(MAX); 


SET @SQLSelect = 'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) FROM dbo.' 
        [email protected]+' (NOLOCK)'; 

EXEC dbo.SP_EXECUTESQL @SQLSelect 
         ,N'@MAXCount VARCHAR(10) OUTPUT, @MinCount VARCHAR(10) OUTPUT' 
         ,@MAXCount OUTPUT 
         ,@MINCount OUTPUT; 

SELECT @MAXCount, @MINCount; 

LiveDemo

Hinweise:

  1. Es sieht aus wie ein schlechtes Design Tisch pro SPID zu erstellen. Verwandte: SELECT * FROM sales + @yymm
  2. Tabellenname SYSNAME Datentyp hat, sollten Sie QUOTENAME für zusätzlichen Schutz vor SQL-Injection
  3. verketten SQL-Abfrage könnte fehleranfällig hinzufügen könnte, könnten Sie REPLACE
  4. NOLOCK führen könnte zu Uncommited liest.

Etwas wie:

DECLARE @MAXCount VARCHAR(10) 
     ,@MINCount VARCHAR(10); 

DECLARE @SQLSelect NVARCHAR(MAX) = 
N'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) 
    FROM <table_name> WITH (NOLOCK)'; 

DECLARE @TempTable SYSNAME = QUOTENAME('Test_'+ '1'); -- CONVERT(VARCHAR(10),@@SPID) 


SET @SQLSelect = REPLACE(@SQLSelect, '<table_name>', @TempTable); 

EXEC dbo.SP_EXECUTESQL @SQLSelect 
         ,N'@MAXCount VARCHAR(10) OUTPUT, @MinCount VARCHAR(10) OUTPUT' 
         ,@MAXCount OUTPUT 
         ,@MINCount OUTPUT; 

SELECT @MAXCount, @MINCount; 
+0

Danke, dass für mich gearbeitet, müssen noch einige der Forschung auf dem _SYSNAME_ und _QUOTENAME_ zu tun. – Joby

Verwandte Themen