执行存储在SQL Server表的列中的查询

时间:2017-09-19 17:59:41

标签: sql-server tsql cursor relational-database

我有一个包含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;

3 个答案:

答案 0 :(得分:0)

--outfile

答案 1 :(得分:0)

如果我理解正确,你在表中有两个字段,但你只能使用光标获得一个字段。在这种情况下,解决方案很简单,您可以使用游标(每个值到不同的变量)获取多个值,然后将该值放在动态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;

答案 2 :(得分:0)

我没有答案,但对问题进一步完善。这里的示例使用存储的SQL作为独立命令。存储在表格列中的SQL片段是否可以用作SELECT列表中的项目?

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