【问题标题】:Execute queries stored in columns of a SQL Server table执行存储在 SQL Server 表列中的查询
【发布时间】:2017-09-19 17:59:40
【问题描述】:

我有一个包含 2 列 QueryNameQuery 的表。我正在尝试执行存储在表的Query 列中的查询。

我想显示记录计数为零以上的任何内容,我们需要使用querynamecount 打印到输出。我正在使用以下光标,我能够显示rowcount,但请任何人建议我如何显示QueryName

DECLARE @Sql NVARCHAR(MAX);

DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR 
    (SELECT Query 
     FROM VWLetterTYB )

OPEN Cur

FETCH NEXT FROM Cur INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
    --Exec sp_executesql @Sql
    EXEC ('SELECT COUNT(*) AS Rowcounts FROM (' + @sql + ') AS t HAVING COUNT(*) > 0 ')

    FETCH NEXT FROM Cur INTO @Sql 
END

CLOSE Cur
DEALLOCATE Cur;

【问题讨论】:

  • 这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • Query 只是一个表名吗?如果是这样,只需将其作为字符串文字添加到选择中
  • 如果查询使用 CTE 怎么办?

标签: sql-server tsql cursor relational-database


【解决方案1】:
DECLARE @Sql NVARCHAR(MAX);

DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR 
    (SELECT Query 
     FROM VWLetterTYB )

OPEN Cur

FETCH NEXT FROM Cur INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
    --Exec sp_executesql @Sql
    EXEC ('SELECT [sql] = ''' + @Sql + ''', COUNT(*) AS Rowcounts FROM (' + @sql + ') AS t HAVING COUNT(*) > 0 ')

    FETCH NEXT FROM Cur INTO @Sql 
END

CLOSE Cur
DEALLOCATE Cur;

【讨论】:

    【解决方案2】:

    如果我理解正确,您的表格中有两个字段,但您只能使用光标找到一个。在这种情况下,解决方案很简单,您可以使用游标获取多个值(每个值都指向不同的变量),然后将该值放入动态 SELECT

    DECLARE @Sql NVARCHAR(MAX), @QueryName NVARCHAR(MAX);
    
    DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR 
        (SELECT Query, QueryName 
         FROM VWLetterTYB )
    
    OPEN Cur
    
    -- variables are filled in the order used in the SELECT (first column to first variable,
    -- second column to second variable, etc.)
    FETCH NEXT FROM Cur INTO @Sql, @QueryName 
    
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        -- when using single quotes inside a string you have to double it
        EXEC ('SELECT '''+ @QueryName+''' AS QueryName, COUNT(*) AS Rowcounts FROM (' + @sql + ') AS t HAVING COUNT(*) > 0 ')
    
        FETCH NEXT FROM Cur INTO @Sql, @QueryName
    END
    
    CLOSE Cur
    DEALLOCATE Cur;
    

    【讨论】:

      【解决方案3】:

      我没有答案,而是对问题进行了进一步的改进。此处的示例将存储的 SQL 用作独立命令。存储在表列中的 SQL 的 sn-p 可以用作 SELECT 列表中的项目吗?

      我有一个代码/名称查找对表。大多数代码导致一个名称。但是需要应用一些逻辑来确定名称。我希望在我的主 SQL 语句中实现这一点。我必须在许多脚本中应用同一个查找表中的这个逻辑。我不想在每个脚本中嵌入复杂的逻辑或维护一个复杂的存储过程。

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-12
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多