Как сохранить результат динамического SQL в переменной?
У меня есть следующее теоретическое утверждение, которое я хотел бы реализовать с использованием динамического SQL (на SQL Server 2016) и сохранить одно выходное значение в переменной (@output
).
@numericvar
, @columnname
, @tablename
должны быть входные параметры. Любая помощь будет принята с благодарностью. Большое спасибо.
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
);
2 ответа
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;
Обновление: рабочий пример для FLOAT
выход. Скрипт использует таблицу в INFORMATION_SCHEMA
Схема, которая есть у всех.
Посмотрите, сможете ли вы заставить его работать из этого примера. Если вы не можете, я предлагаю вам отредактировать ваш вопрос и добавить точный скрипт + значения параметров, которые вы используете + указание типа имени столбца.
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<=@numericvar 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;
Попробуйте это, у меня есть копия, вставленная здесь и там, вам, возможно, придется немного поработать в случае.
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, @numericvar=@numericvar, @tablename=@tablename
select @output