sql - 如何循环在 SQL Server 中动态创建的查询
问题描述
我有一个存储过程,我从表中获取数据库名称,然后尝试从该数据库名称创建动态查询并获取结果。获取结果后,我需要循环这些结果以执行进一步的查询以获得所需的结果
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 查询是动态的 - 我如何循环这个动态查询的输出。
解决方案
由于 SQL 查询是动态的,我如何循环这个动态查询的输出。
在动态查询之外创建一个临时表,并在动态查询中插入其中。然后你可以从临时表中读取。
SET @SQL = N'
INSERT INTO #tempUser(userId,IsFirst,IsTemp,inactive,createddate)
SELECT userid, isfirst, istemp, inactive, createddate
FROM ' +QUOTENAME(@clientid)+'.USER.queen_user;';
但更好的整体方法可能是在一个单独的数据库中为所有表创建一个分区视图。例如
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
并且有一个程序可以在添加新的客户端数据库时随时更改它。
推荐阅读
- next.js - 赛普拉斯中的下一个生产包找不到静态文件
- c++ - 使用静态 constexpr 成员变量作为模板方法参数
- github - 找不到要输出的文件或脚本
- c++ - 如何在每次迭代中随机生成一个字符串?
- dataset - GCP AutoML“复杂”示例
- aws-api-gateway - 在 swagger 文档中隐藏端点/请求类型:AWS Api Gateway、Swagger-UI 还是其他方法?
- c# - 测试列表
- freeradius - 在有线连接上使用 PEAP 和 MSCHAPv2
- javascript - 如何并行运行多个异步函数;用户在哪里输入要运行的功能数量?
- aiml - SRAI 到带有通配符的模式?