【问题标题】:How to use a for each loop type in a SQL Query如何在 SQL 查询中使用 for each 循环类型
【发布时间】:2017-05-10 18:52:48
【问题描述】:

有没有办法通过 SQL 中的字符串数组执行某种类型的循环?我将数据附加到#T_POLICY,并且我想用一个数据库运行查询,并用不同的数据库运行相同的查询。

例如

use Staging__4SBI_STG_BG
go

WITH cteEnumerate AS
(
    SELECT *
           ,RN = ROW_NUMBER() OVER (PARTITION BY POLICY_ID ORDER BY LOADDATE DESC)
    FROM dbo.STG_POLICY
)
INSERT INTO #T_POLICY
SELECT SOURCE, AGENCY_D, POL_SEQ, POLICY_ID, POL_ENDNUMBER, PRODUCT_ID, 
COMPANY_ID
FROM cteEnumerate
WHERE RN = 1
ORDER BY POLICY_ID; 

所以我想使用的下一个是使用 Staging__4SBI_STG_TB 而不是 BG,并且还有很多其他的要运行。我可以用这些名称创建一个表并遍历它们吗?任何帮助都会很棒。

谢谢

【问题讨论】:

  • 存储过程中的动态 SQL while 循环或游标:stackoverflow.com/questions/18513986/… 游标将针对每个数据库,然后将执行动态 SQL 以更改数据库。那么你的查询...
  • 感谢您的评论。看起来存储过程将是我的最佳选择,尽管作为只读用户我不确定我是否有权创建存储过程。

标签: sql sql-server


【解决方案1】:

如何加载表 dbo.STG_POLICY?您可以将列 IsLatestPolicy BIT 添加到表中。

WITH cte AS (SELECT *
                           ,RN = ROW_NUMBER() OVER (PARTITION BY POLICY_ID ORDER BY LOADDATE DESC)
                      FROM dbo.STG_POLICY
)
UPDATE cte
SET IsLatestPolicy = CASE WHEN RN = 1 THEN 1 ELSE 0 END;

所以每次都可以选择原表

SELECT SOURCE
      , AGENCY_D
      , POL_SEQ
      , POLICY_ID
      , POL_ENDNUMBER
      , PRODUCT_ID
      , COMPANY_ID
FROM dbo.STG_POLICY
WHERE IsLatestPolicy = 1

因此无需创建另一个表来启动循环。

【讨论】:

  • 感谢您的评论,我刚刚回到这里,感谢您的回答。不幸的是,我无权加载数据,只是查看它,我希望源数据中有一个最新的策略信息标志。我实际上必须创建临时表,然后创建一些计算字段并从临时表中查询。
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多