【问题标题】:How to get the MAX count and MIN count from a Dynamic table如何从动态表中获取 MAX 计数和 MIN 计数
【发布时间】:2016-05-07 16:49:12
【问题描述】:

这是我尝试过的,但出错了

消息 137,第 15 级,状态 1,第 1 行
必须声明标量变量“@MAXCount”

代码:

DECLARE @TempTable  NVARCHAR(MAX)
DECLARE @MAXCount   VARCHAR(10)
DECLARE @MINCount   VARCHAR(10)
DECLARE @SQLSelect  NVARCHAR(MAX)

SET @TempTable = 'Test_'+CONVERT(VARCHAR(10),@@SPID)

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

EXEC SP_EXECUTESQL @SQLSelect

【问题讨论】:

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


    【解决方案1】:

    您必须将变量作为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 可能导致未提交的读取。

    类似:

    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;
    

    【讨论】:

    • 谢谢你为我工作,仍然需要对 SYSNAMEQUOTENAME 做一些研究。
    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 2017-08-07
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2021-11-15
    • 2019-07-29
    • 2017-11-19
    相关资源
    最近更新 更多