2016-11-05 111 views
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

浮球和浮球。 (請原諒反應遲滯,我是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 
相關問題