我用的是SQL2008,存储过程里写了很长一串SQL查询语句,如下:CREATE PROCEDURE TEST @FSQL  varchar(8000) ASSELECT ……
FROM (SELECT …… FROM TABLEA
      UNION ALL
      SELECT …… FROM TABLEB
      UNION ALL
      SELECT …… FROM TABLEC
      UNION ALL
      SELECT …… FROM TABLED
     )AS TB
WHERE ('A'= @FSQL)  如果我传入参数@FSQL等于'A',就可以正常执行如果我传入参数@FSQL等于'A') AND (类型 IN ('优','良'),就无法正常执行了.但是,我如果直接将存储过程中的语句拷到"新建查询"里,并将@FSQL参数替换成'A') AND (类型 IN ('优','良'),也是可以正常执行的.换个方式,如下是可以正常执行的(我不想这样转,因为我SQL语句里有很多单引号,调试很不方便,而且容易出错).
Declare @sql  varchar(8000)SET @sql='  
SELECT ……
FROM (SELECT …… FROM TABLEA
      UNION ALL
      SELECT …… FROM TABLEB
      UNION ALL
      SELECT …… FROM TABLEC
      UNION ALL
      SELECT …… FROM TABLED
     )AS TB
WHERE (''A''='+ @FSQL+')'exec   (@sql)   
问题:不想将存储过程里的SQL语句转用单引号后,再来加上参数执行,当参数为多条件查询时,有没有办法处理?

解决方案 »

  1.   

    传字符串参数做条件,只能用exec动态执行,就照你最后那个方法做吧。
      

  2.   

    真的没有办法吗?主要是我的SQL语句很多单引号限制条件,如果转成最后那种情况,相当麻烦,调试出错都不知道如何去找原因.
      

  3.   

    可以把拼接的字符串print出来检查一下
      

  4.   

    WHERE ('A'= @FSQL) 
    这个A应该是字段吧
    怎么用引号变成字符了
      

  5.   

    CREATE PROCEDURE TEST @FSQL varchar(8000) ASEXEC('SELECT ……
    FROM (SELECT …… FROM TABLEA
      UNION ALL
      SELECT …… FROM TABLEB
      UNION ALL
      SELECT …… FROM TABLEC
      UNION ALL
      SELECT …… FROM TABLED
      )AS TB
    WHERE 1=1 '+@FSQL)goEXEC TEST ' And  A=''A'' and 类型 IN (''优'',''良'')'A--為字段時