1

У меня есть следующий теоретический оператор, который я бы хотел реализовать с помощью динамического SQL (на SQL Server 2016) и сохранить одно значение вывода в переменной (@output).Как сохранить результат динамического SQL в переменной?

@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 
); 

ответ

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; 

Обновление: рабочий пример для 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<[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

Я получаю ошибку арифметического переполнения, преобразуя nvarchar в тип данных числовой. – Kanarinox

+0

@ Kanarinox Что вы взяли за тип переменной '@ output'? И каков тип столбца, который вы передаете в '@ columnname'? –

+0

Float & Float. (Извините за задержку ответа. Я gmt + 4). – Kanarinox

1

попробуйте это, у меня есть копия, вставленная здесь и там, вам, возможно, придется немного поработать на всякий случай.

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 
Смежные вопросы