1

Ich habe die folgende theoretische Anweisung, die ich mit dynamischem SQL (in SQL Server 2016) implementieren möchte und den einzelnen Ausgabewert in der Variablen (@output) speichern.Wie speichert man das Ergebnis von dynamischem SQL in einer Variablen?

@numericvar, @columnname, @tablename sollten Eingabeparameter sein. Jede Hilfe würde sehr geschätzt werden. Danke vielmals.

SELECT @output = (
    SELECT 
     MAX(CASE WHEN ROWNUM*1.0/NUMROWS <= @numericvar THEN @columnname END) 
    FROM (
     SELECT 
      @columnname, 
      ROW_NUMBER() OVER (ORDER BY @columnname) AS ROWNUM, 
      COUNT(*) OVER (PARTITION BY NULL) AS NUMROWS 
     FROM 
      @tablename 
    ) @tablename 
); 

Antwort

1
DECLARE @columnname SYSNAME, @tablename SYSNAME, @numericvar NUMERIC(18,2); 
DECLARE @output NUMERIC(18,2); 

DECLARE @sql NVARCHAR(MAX) = N' 
    SET @output = (
     SELECT 
      MAX(CASE WHEN ROWNUM*1.0/NUMROWS <= @numericvar THEN '+QUOTENAME(@columnname)+N' END) 
     FROM (
      SELECT 
       '+QUOTENAME(@columnname)+N', 
       ROW_NUMBER() OVER (ORDER BY '+QUOTENAME(@columnname)+N') AS ROWNUM, 
       COUNT(*) OVER (PARTITION BY NULL) AS NUMROWS 
      FROM 
       '+QUOTENAME(@tablename)+N' 
     ) AS t 
    ); 
'; 

EXECUTE sp_executesql 
    @sql, 
    N'@numericvar NUMERIC(18,2), @output NUMERIC(18,2) OUTPUT', 
    @numericvar, @output OUTPUT; 

SELECT @output; 

Update: ein funktionierendes Beispiel für FLOAT ausgegeben. Das Skript verwendet eine Tabelle im INFORMATION_SCHEMA Schema, das jeder hat.

Sehen Sie, wenn Sie es von diesem Beispiel funktionieren lassen können. Wenn Sie nicht können, schlage ich vor, dass Sie Ihre Frage bearbeiten, und fügen Sie das genaue Skript + die Parameterwerte hinzu, die Sie verwenden + Angabe des Typs des Spaltennamens.

DECLARE @schemaname SYSNAME='INFORMATION_SCHEMA', 
     @tablename SYSNAME='COLUMNS', 
     @columnname SYSNAME='NUMERIC_PRECISION', 
     @numericvar NUMERIC(18,2)=.5; 

DECLARE @output_f FLOAT; 

DECLARE @sql NVARCHAR(MAX) = N' 
    SET @output_f = (
      SELECT 
       MAX(CASE WHEN ROWNUM*1.0/NUMROWS<[email protected] THEN '+QUOTENAME(@columnname)+N' END) 
      FROM (
       SELECT 
        '+QUOTENAME(@columnname)+N', 
        ROW_NUMBER() OVER (ORDER BY '+QUOTENAME(@columnname)+N') AS ROWNUM, 
        COUNT(*) OVER() AS NUMROWS 
       FROM 
        '+QUOTENAME(@schemaname)+N'.'+QUOTENAME(@tablename)+N' 
      ) AS t 
    ); 
'; 

EXECUTE sp_executesql 
    @sql, 
    N'@numericvar NUMERIC(18,2), @output_f FLOAT OUTPUT', 
    @numericvar, @output_f OUTPUT; 

SELECT @output_f; 
+0

Ich bekomme einen arithmetischen Überlauffehler, der nvarchar in numerischen Datentyp konvertiert. – Kanarinox

+0

@Kanarinox Was haben Sie für den Typ der Variablen '@ output' genommen? Und was ist der Typ der Spalte, die Sie in '@ Spaltenname' übergeben? –

+0

Float & Float. (Entschuldigen Sie die Antwortverzögerung. Ich bin gmt + 4). – Kanarinox

1

versuchen Sie dies, ich habe Kopie eingefügt hier und da, Sie müssen möglicherweise ein wenig für den Fall umgehen.

declare @query nvarchar(max) 
declare @output nvarchar(max) 
declare @columnname nvarchar(max) 
declare @tablename nvarchar(max) 
declare @numericvar NUMERIC(18,0) 

    set @query ='SELECT @output = (
     SELECT 
      MAX(CASE WHEN ROWNUM*1.0/NUMROWS <= @numericvar THEN @columnname END) 
     FROM (
      SELECT 
       @columnname, 
       ROW_NUMBER() OVER (ORDER BY @columnname) AS ROWNUM, 
       COUNT(*) OVER (PARTITION BY NULL) AS NUMROWS 
      FROM 
       @tablename 
     ) @tablename 
    );' 

    exec sp_executesql @query, N'@output numeric(18,2) output, 
    @columnname nvarchar(max), declare @numericvar NUMERIC(18,0), 
    declare @tablename nvarchar(max)', @output= @output output, @columnname= @columnname, @[email protected], @[email protected] 
    select @output 
Verwandte Themen