首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带游标的条件动态SQL

带游标的条件动态SQL
EN

Stack Overflow用户
提问于 2010-07-21 21:45:14
回答 2查看 984关注 0票数 1

我有一个查询,它使用游标循环显示select语句的结果。

简而言之,select语句从我拥有的映射表中选择所有记录。其中一列是“SourceTableName”。

我使用这个字段来生成一些动态SQL。

我希望在我的存储过程中添加一个参数,如果我传入一个'SourceTableNameFilter‘,它将允许我只为我想要的'SourceTableName’创建动态SQL。

我被一些包装我的动态SQL的逻辑所困扰。

IF @SourceTableNameFilter(SP参数)=@SourceTableName(来自映射表) BEGIN

生成并执行一些基于SourceTableName的动态SQL。

问题是,我希望这对所有从select返回的表都有效,但是如果@SourceTableNameFilter参数存在并且不为null,那么只为游标中与我的过滤器参数匹配的任何行生成动态SourceTableName。

有没有一种方法可以让我在不复制IF/ELSE内部的逻辑两次的情况下,用IF语句来完成这项工作?

代码语言:javascript
复制
 FETCH NEXT FROM TABLECUR INTO @SourceTableName
     ,@SourceInColumn
     ,@SourceOutColumn
     ,@TargetTableName
     ,@TargetLookupColumn
     ,@TargetLookupResultColumn
     ,@MappingTableID

 WHILE (@@fetch_status <> -1)
 BEGIN
  IF (@@fetch_status <> -2)
  BEGIN


                IF (@SourceTableName = @SourceTableNameFilter)

                 --GENERATE DYNAMIC SQL

                ELSE 
                 --GENERATE DYNAMIC SQL FOR ALL RECORDS

生成动态SQL字符串在if和else中是相同的,有什么方法可以更改条件,使我不会重复生成动态SQL,并且当@SourceTableName != @SourceTableNameFilter?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-21 22:05:59

请考虑将此逻辑添加到游标定义中,而不是将该逻辑放在每个游标记录的处理中。

因此,如果光标通常是:

代码语言:javascript
复制
DECLARE MY_CURSOR Cursor     FOR
SELECT SourceTableName, SourceInColumn, SourceOutColumn
       ,TargetTableName, TargetLookupColumn
       ,TargetLookupResultColumn, MappingTableID

FROM MappingTable
--get source tables when filter is specified; otherwise get all
WHERE (SourceTableName = @SourceTableNameFilter) OR (LEN(ISNULL(SourceTableNameFilter,'')=0)

现在,您可以在游标中执行业务逻辑,而不必检测过滤表。游标将加载您需要关注的记录。从问题看,无论是否传入筛选器,业务逻辑都是相同的。如果这是不正确的,或者如果它不能满足您的要求,请评论。

票数 2
EN

Stack Overflow用户

发布于 2010-07-21 22:05:45

对于您正在构建的动态sql一无所知,我建议您这样做:

代码语言:javascript
复制
SET @DynamicCommand = '<whatever, first part>'
 + isnull(@SourceTableNameFilter
          ,'<no special action, perhaps just empty string>'
          ,'<add conditional text dependent upon contents of @SourceTableNameFilter>')
 + '<whatever, second part>'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3299885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档