2010-07-21 58 views
1

我有一个查询使用游标来遍历select语句的结果。带光标的条件动态SQL

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

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

我正在寻找添加一个参数到我的存储过程,这将允许我只为'SourceTableName'创建动态SQL,如果我传入'SourceTableNameFilter'。

我困住了一些包装我的动态SQL的逻辑。

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

生成并执行基于该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字符串是相同的两个,如果和其他人,没有办法更改条件,使我不能复制动态SQL生成和不生成动态SQL当@SourceTableName != @SourceTableNameFilter?

谢谢

回答

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) 

现在你可以不必检测过滤表或没有游标中执行业务逻辑。游标将加载您需要关心的记录。从问题中可以看出,无论过滤器是否通过,业务逻辑都是一样的。如果这不正确,或者不符合您的要求,请发表评论。

+0

辉煌。非常感谢你!! – user53885 2010-07-21 14:12:04

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

谢谢。由于游标不允许使用动态SQL,因此我在走这条路线时遇到了一个问题。我可能弄错了,但感谢回应! – user53885 2010-07-21 14:19:08