【问题标题】:Conditional dynamic SQL with cursor带游标的条件动态 SQL
【发布时间】:2010-07-21 22:05:59
【问题描述】:

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

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

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

我希望将一个参数添加到我的存储过程中,这将允许我只为我想要的“SourceTableName”创建动态 SQL - 如果我传入一个“SourceTableNameFilter”。

我被一些包含动态 SQL 的逻辑卡住了。

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

根据 SourceTableName 生成并执行一些动态 SQL。

问题是,我希望它适用于从针对“SourceTableName”的选择返回的所有表,但如果存在 @SourceTableNameFilter 参数且不为空 - 然后只为游标中的任何行生成动态 SQL匹配我的过滤器参数。

有没有办法让我用 IF 语句完成此操作,而无需复制 IF/ELSE 中的逻辑两次?

 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 时不生成动态 SQL ?

谢谢

【问题讨论】:

    标签: tsql


    【解决方案1】:

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

    所以如果光标正常:

    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】:

    对您正在构建的动态 sql 一无所知,我建议您按照以下方式进行操作:

    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>'
    

    【讨论】:

    • 谢谢。我在走这条路线时遇到了一个问题,因为游标不允许动态 SQL。我可能弄错了,但感谢您的回复!
    猜你喜欢
    • 2014-11-26
    • 2013-03-25
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2016-04-02
    • 2015-01-28
    相关资源
    最近更新 更多