在一个T-SQL的存储过程里
接收一个参数:@FLG根据@FLG的值来动态拼写SQL文
譬如:
SELECT 
    AAAAA
FROM
    TABLE
WHERE
    DELFLG = '0'
    AND (要添加位置)要求是:
如果@FLG = '1' ,在AND条件括号里添加这句话:AAFLG LIKE '1_'
如果@FLG != '1' ,在AND条件括号里添加这句话:AAFLG LIKE '2_' OR AAFLG LIKE '3_'这个要如何写呢?
请高人指点,另外,请确保可以正确表达语义(1:业务逻辑正确;2:语法正确),谢谢!

解决方案 »

  1.   

    declare @sql as varchar(100)
    if @FLG = '1'
       set @sql = 'select aaaaa from tb where ...'
    else
       set @sql = 'select aaaaa from tb where ...'exec(@sql)
      

  2.   


    Declare @T_SQL varchar(8000)
    set @T_SQL='SELECT AAAAA FROM TABLE WHERE DELFLG =  ''0''' 
    if @FLG='1'
       set @T_SQL=@T_SQL + 'and AAFLG   LIKE   '1_' ' 
    else 
       set @T_SQL=@T_SQL + 'AAFLG   LIKE   '2_'   OR   AAFLG   LIKE   '3_' ' exec @T_SQL
      

  3.   

    哥哥,有没有更好的方法啊?
    我的sql文已经连了8张table了
    差不多有100行啦
    如果这样的话我岂不是惨啦
    能不能只根据参数改动SELECT   
            AAAAA 
    FROM 
            TABLE 
    WHERE 
            DELFLG   =   '0' 
            AND   (要添加位置) 的“(要添加位置)”部分? 
      

  4.   

    另外一个问题就是:
    我的这一段SQL文是用来定义CURSOR的。
    DECLARE CUR_AAAAA CURSOR LOCAL STATIC FOR
    SELECT       
                    AAAAA   
    FROM   
                    TABLE   
    WHERE   
                    DELFLG       =       '0'   
                    AND       (要添加位置) 如果用上边两位的写法,这样又该如何组织呢?
    可行吗?
      

  5.   


    declare @sql varchar(512)
    set @sql = '
    SELECT  
            AAAAA
    FROM
            TABLE
    WHERE
            DELFLG   =   ''0'' 
    and 
    'declare @FLG int
    declare @addicondition varchar(128)IF @FLG=1
    set @addicondition = 'AAFLG like ''1_'''
    ELSE 
    set @addicondition = '(AAFLG like ''2_'' or AAFLG like ''3_'')'set @SQL = @sql + @addiconditionexec @SQL
      

  6.   

    谢谢各位的热心帮助
    可是问题还没有解决在一个T-SQL的存储过程里 
    接收一个参数:@FLG 根据@FLG的值来动态拼写SQL文 
    譬如: 
    SELECT   
            AAAAA 
    FROM 
            TABLE 
    WHERE 
            DELFLG   =   '0' 
            AND   (要添加位置) 要求是: 
    如果@FLG   =   '1'   ,在AND条件括号里添加这句话:AAFLG   LIKE   '1_' 
    如果@FLG   !=   '1'   ,在AND条件括号里添加这句话:AAFLG   LIKE   '2_'   OR   AAFLG   LIKE   '3_' -------------------------------
    我的这一段SQL文是用来定义CURSOR的。|
    -------------------------------
     
    DECLARE   CUR_AAAAA   CURSOR   LOCAL   STATIC   FOR 
    SELECT   
            AAAAA 
    FROM 
            TABLE 
    WHERE 
            DELFLG   =   '0' 
            AND   (要添加位置)怎么写啊?
      

  7.   

    create proc proc_name
    @flg int
    as
    begin
    declare @sql varchar(512)
    set @sql = '
    SELECT  
            AAAAA
    FROM
            TABLE
    WHERE
            DELFLG   =   ''0'' 
        and 
    '
    IF @FLG=1
        set @sql = 'AAFLG like ''1_'''
    ELSE 
        set @sql = '(AAFLG like ''2_'' or AAFLG like ''3_'')'exec (@SQL)
      

  8.   

    create proc proc_name
    @flg int
    as
    begin
    declare @sql varchar(512)
    set @sql = '
    SELECT  
            AAAAA
    FROM
            TABLE
    WHERE
            DELFLG   =   ''0'' 
        and 
    '
    IF @FLG=1
        set @sql = @sql +'AAFLG like ''1_'''
    ELSE 
        set @sql = @sql +'(AAFLG like ''2_'' or AAFLG like ''3_'')'exec (@SQL)
      

  9.   

    首先,谢谢各位的帮助!
    可是,大家难道都没有看到我的这个动态拼接的SQL文的前提吗?--------------------------------------------------------
    这里重申一下:这一段SQL文是用来定义CURSOR的
    --------------------------------------------------------上边各位的方法也许都出色完成了拼接,可是根本不能达到需求啊!
    我需要的是不但能完成拼接,还能完成CURSOR的DECLARE才行啊!接收一个参数:@FLG CHAR(1)
    如果@FLG   =   '1'   ,在AND条件括号里添加这句话:AAFLG   LIKE   '1_' 
    如果@FLG   !=   '1'   ,在AND条件括号里添加这句话:AAFLG   LIKE   '2_'   OR   AAFLG   LIKE   '3_' 
    用来动态定义一个CURSOR ,如下:DECLARE CUR_AAAAA CURSOR LOCAL STATIC FOR
    //Add your code here
    SELECT   
            AAAAA 
    FROM 
            TABLE 
    WHERE 
            DELFLG   =   '0' 
            AND   (要添加位置)
      

  10.   

    你要把定义也写在动态sql字符串中就行了,简单举例如下:
    declare @str varchar(1000)
    set @str='declare @t int set @t=10 print @t'
    exec (@str)
      

  11.   

    我无言啦!
    难道大家让我开始怀疑自己的表达能力啦!
    为什么还在写这样的东西啊?
    我哭啦
    真的!各位哥哥,我求求你们,发帖前看清楚我要做什么好吗?
    大家为什么都给我写如下的逻辑:
    IF @FLG=1 
        set @sql = @sql +'AAFLG like ''1_'''
    ELSE   
        set @sql = @sql +'(AAFLG like ''2_'' or AAFLG like ''3_'')' SQL中加入这个逻辑,我想我会写,要不也不用做软件开发啦!
    可我要的是如何定义一个动态CURSOR,CURSOR的做成条件里加入这样的动态逻辑我请问,大家有谁给我的方案里有动态CURSOR的定义啦?
    哪怕是CURSOR关键字?有吗?
    所以,我说,帮别人也要负责任!!!
    这算什么解决方案,简直和问题没一点关系
    连最起码的CURSOR关键字我都没看到。算啦,还是感谢大家的热心,即使你根本不知道我是要什么。问题已经解决啦,详细见http://topic.csdn.net/u/20071217/14/b7093d2a-4ee0-4640-837f-9bf4e9261e58.html
      

  12.   

    create  proc testproc
    @FLG nvarchar(1)
    as 
    begin
    declare @AAAA nvarchar(50)
    declare @cursorname cursorset @cursorname = cursor local for select AAAAA from BBBB where DELFLG ='' and (AAFLG LIKE (CASE WHEN @FLG='1' THEN '1_'  ELSE '2_' END) OR AAFLG LIKE (CASE WHEN @FLG!='1' THEN '3_' END) )
    open @cursorname
    fetch next from  @cursorname into @AAAA
    while @@fetch_status = 0
    begin
                     --数据处理在这里
    SELECT @AAAA  fetch next from  @cursorname into @AAAA
    end
    end
      

  13.   

    wengoal 老兄的方法可以借鉴参考
    可是绝对是不正确的
    如果@FLG = ‘1’
    你写的:
    set   @cursorname   =   cursor   local   for   select   AAAAA   from   BBBB   where   DELFLG   =''   and   (AAFLG   LIKE   (CASE   WHEN   @FLG='1'   THEN   '1_'     ELSE   '2_'   END)   OR   AAFLG   LIKE   (CASE   WHEN   @FLG!='1'   THEN   '3_'   END)   ) 会变成什么样子?就是变成这个样子:
    set   @cursorname   =   cursor   local   for   select   AAAAA   from   BBBB   where   DELFLG   =''   and (AAFLG   LIKE ‘1_’ OR  AAFLG   LIKE )很明显这会有语法错误的