带游标的条件动态SQL

时间:2010-07-21 13:45:14

标签: tsql

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

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

我使用此字段生成一些动态SQL。

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

我遇到了一些包含动态SQL的逻辑。

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

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

问题是,我希望这可以处理所有从selectTable返回的表,如果存在@SourceTableNameFilter参数而不是null - 那么只为游标中的任何行生成动态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 ?

谢谢

2 个答案:

答案 0 :(得分:2)

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

所以如果光标是正常的:

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)

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

答案 1 :(得分:1)

对你正在构建的动态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>'