我有一个查询,它使用游标循环显示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 ?
谢谢
答案 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>'