如何循环在 SQL Server 中动态创建的查询

Posted

技术标签:

【中文标题】如何循环在 SQL Server 中动态创建的查询【英文标题】:How to LOOP a query that is created dynamically in SQL Server 【发布时间】:2020-06-09 14:00:54 【问题描述】:

我有一个存储过程,我从表中获取数据库名称,然后尝试从该数据库名称创建动态查询并获取结果。获取结果后,我需要循环这些结果以执行进一步的查询以获得所需的结果

USE DATABASE1
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [User].[update_client_details] 
AS
    DECLARE @clientdata CURSOR,
            @clientid INT,
            @SQL NVARCHAR(2000),
            @uid INT,
            @isFirst INT,
            @isTemp INT,
            @inactive INT,
            @createdDate Date

BEGIN
    DECLARE C CURSOR LOCAL FOR 
        SELECT clientuserid FROM USER.queen_client

    OPEN C
    FETCH NEXT FROM C INTO @clientid

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @SQL = N'SELECT userid, @isFirst=isfirst, @isTemp=istemp, @inactive=inactive, @createdDate=createddate FROM ' +QUOTENAME(@clientid)+'.USER.queen_user;';

        EXEC sys.sp_executesql @SQL, N'@inactive int OUTPUT, @uid int OUTPUT, @isFirst int OUTPUT, @isTemp int OUTPUT, @createdDate date OUTPUT', @inactive OUTPUT, @uid OUTPUT, @isFirst OUTPUT, @isTemp OUTPUT, @createdDate OUTPUT;

        // @SQL returns multiple rows - I need to loop the output of @SQL 
        // UPDATE QUERY BASED ON IF CONDITION COMES HERE

        FETCH NEXT FROM C INTO @clientid
    END

    CLOSE C
    DEALLOCATE C
END

由于 SQL 查询是动态的 - 我如何循环此动态查询的输出。

【问题讨论】:

该动态语句不是我之前给您的查询,该动态语句也不起作用,您无法在为变量赋值的同一查询中返回数据集。另外,您没有在 sp_executesql 中定义 @isFirst @Larnu 是的,我修改了这些字段。那么如何循环数据集呢? 【参考方案1】:

由于 SQL 查询是动态的,我如何循环这个动态查询的输出。

在动态查询之外创建一个临时表,并在动态查询中插入其中。然后你可以从临时表中读取。

    SET @SQL = N'
INSERT INTO #tempUser(userId,IsFirst,IsTemp,inactive,createddate)
SELECT userid, isfirst, istemp, inactive, createddate 
FROM ' +QUOTENAME(@clientid)+'.USER.queen_user;';

但更好的整体方法可能是在一个单独的数据库中为所有表创建一个分区视图。 EG

create view queen_user
as
select 123 clientId, userid, isfirst, istemp, inactive
from Client123.USER.queen_user
union all
select 124 clientId, userid, isfirst, istemp, inactive
from Client124.USER.queen_user
union all
. . .
union all
select 999 clientId, userid, isfirst, istemp, inactive
from Client999.USER.queen_user

并且有一个程序可以在添加新的客户端数据库时随时更改它。

【讨论】:

我不需要创建新表。我已经有一张桌子我也得到了结果。但我想知道如何循环这些结果 这是一个视图,而不是一个表格。答案的第一部分告诉你如何做到这一点:循环动态查询的结果,先插入临时表,然后循环。

以上是关于如何循环在 SQL Server 中动态创建的查询的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server Express 中的动态查询创建 RDLC 报告

如何在sql server用户定义函数中循环查询结果集?

SQL Server 动态 PIVOT 查询 - 字段顺序

sql server存储过程如何动态生成表名

使用 PDO 驱动程序 PHP 在 sql-server 查询中循环

SQL Server 查询中的动态表名和变量名