如何从动态表中获取MAX计数和MIN计数

时间:2016-05-07 16:49:13

标签: sql sql-server tsql sql-server-2008-r2 dynamic-sql

这是我试过的并且出错了

  

Msg 137,Level 15,State 1,Line 1
  必须声明标量变量" @ MAXCount"

代码:

:invalid {
  box-shadow: none;
}

:-moz-submit-invalid {
  box-shadow: none;
}

:-moz-ui-invalid {
  box-shadow:none;
}

1 个答案:

答案 0 :(得分:0)

您必须将变量作为OUTPUT参数传递:

DECLARE @TempTable  NVARCHAR(MAX) =  'Test_'+ '1'; -- CONVERT(VARCHAR(10),@@SPID)
DECLARE @MAXCount   VARCHAR(10);
DECLARE @MINCount   VARCHAR(10);
DECLARE @SQLSelect  NVARCHAR(MAX);


SET @SQLSelect = 'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) FROM dbo.'
                  +@TempTable+' (NOLOCK)';

EXEC dbo.SP_EXECUTESQL @SQLSelect
                      ,N'@MAXCount VARCHAR(10) OUTPUT, @MinCount VARCHAR(10) OUTPUT'
                      ,@MAXCount OUTPUT
                      ,@MINCount OUTPUT;

SELECT @MAXCount, @MINCount;

LiveDemo

注意:

  1. 根据SPID创建表格看起来很糟糕。相关:SELECT * FROM sales + @yymm
  2. 表名应具有SYSNAME数据类型,您可以添加QUOTENAME以防止SQL注入的其他保护
  3. 连接SQL查询可能容易出错,您可以使用REPLACE
  4. NOLOCK可能导致无意义的读取。
  5. 类似的东西:

    DECLARE @MAXCount   VARCHAR(10)
           ,@MINCount   VARCHAR(10);
    
    DECLARE @SQLSelect  NVARCHAR(MAX) = 
    N'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) 
      FROM <table_name> WITH (NOLOCK)';
    
    DECLARE @TempTable  SYSNAME =  QUOTENAME('Test_'+ '1'); -- CONVERT(VARCHAR(10),@@SPID)
    
    
    SET @SQLSelect = REPLACE(@SQLSelect, '<table_name>', @TempTable);
    
    EXEC dbo.SP_EXECUTESQL @SQLSelect
                          ,N'@MAXCount VARCHAR(10) OUTPUT, @MinCount VARCHAR(10) OUTPUT'
                          ,@MAXCount OUTPUT
                          ,@MINCount OUTPUT;
    
    SELECT @MAXCount, @MINCount;