我有一个查询,它使用游标循环显示select语句的结果。
简而言之,select语句从我拥有的映射表中选择所有记录。其中一列是“SourceTableName”。
我使用这个字段来生成一些动态SQL。
我希望在我的存储过程中添加一个参数,如果我传入一个'SourceTableNameFilter‘,它将允许我只为我想要的'SourceTableName’创建动态SQL。
我被一些包装我的动态SQL的逻辑所困扰。
IF @SourceTableNameFilter(SP参数)=@SourceTableName(来自映射表) BEGIN
生成并执行一些基于SourceTableName的动态SQL。
问题是,我希望这对所有从select返回的表都有效,但是如果@SourceTableNameFilter参数存在并且不为null,那么只为游标中与我的过滤器参数匹配的任何行生成动态SourceTableName。
有没有一种方法可以让我在不复制IF/ELSE内部的逻辑两次的情况下,用IF语句来完成这项工作?
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?
谢谢
发布于 2010-07-21 22:05:59
请考虑将此逻辑添加到游标定义中,而不是将该逻辑放在每个游标记录的处理中。
因此,如果光标通常是:
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)现在,您可以在游标中执行业务逻辑,而不必检测过滤表。游标将加载您需要关注的记录。从问题看,无论是否传入筛选器,业务逻辑都是相同的。如果这是不正确的,或者如果它不能满足您的要求,请评论。
发布于 2010-07-21 22:05:45
对于您正在构建的动态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>'https://stackoverflow.com/questions/3299885
复制相似问题