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;
Ich bekomme einen arithmetischen Überlauffehler, der nvarchar in numerischen Datentyp konvertiert. – Kanarinox
@Kanarinox Was haben Sie für den Typ der Variablen '@ output' genommen? Und was ist der Typ der Spalte, die Sie in '@ Spaltenname' übergeben? –
Float & Float. (Entschuldigen Sie die Antwortverzögerung. Ich bin gmt + 4). – Kanarinox