USE pubs
GOIF ( EXISTS ( SELECT * FROM sysobjects WHERE name = 'CompanySurvey' and type = 'P' ) )
  DROP PROCEDURE CompanySurvey
GO
CREATE PROCEDURE CompanySurvey 
WITH ENCRYPTION
AS
  IF ( EXISTS ( SELECT * FROM tempdb.dbo.sysobjects WHERE name = '##customeretvalue' ))
    DROP TABLE ##customeretvalue    select a.stock_code as 证券代码, 
           a.stock_name as 证券名称,
           a.price as 最新价,
           sum(a.amount) as 托管数量, 
           sum(a.etvalue) as 托管市值, 
           case
              when a.exchange_type = '1' then '上海A股'
              when a.exchange_type = '2' then '深圳A股'
              when a.exchange_type = 'D' then '上海B股'
              when a.exchange_type = 'H' then '深圳B股'
            end 交易类别,
            rtrim(b.dict_prompt) as 股票类别
      into ##sumstocketvalue 
      from customeretvalue a, dictionary b
     where (a.stock_type = b.subentry) and (dict_entry = 1206) 
  group by a.stock_code, 
           a.stock_name, 
           a.price,
           b.dict_prompt,
           a.exchange_type 
  order by a.stock_code 
 GO这里的表customeretvalue , dictionary 如何用变量代替,用参数传递进去???

解决方案 »

  1.   


    动态sql语句基本语法 
    1 :普通SQL语句可以用Exec执行 eg:   Select * from tableName 
             Exec('select * from tableName') 
             Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:   
    declare @fname varchar(20) 
    set @fname = 'FiledName' 
    Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功 
    exec sp_executesql @s   -- 此句会报错 declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功     
    exec sp_executesql @s   -- 此句正确 3. 输出参数 
    declare @num int, 
            @sqls nvarchar(4000) 
    set @sqls='select count(*) from tableName' 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
                   @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num 
      

  2.   

    动态SQL对于这种语句很长的存储过程怎么处理呢?
      

  3.   


    EXEC('SELECT * FROM '+@TableName+'...')
      

  4.   


    CREATE PROCEDURE CompanySurvey 
    @customeretvalue VARCHAR(50),
    @dictionary VARCHAR(50)
    WITH ENCRYPTION
    ASEXEC('
      IF ( EXISTS ( SELECT * FROM tempdb.dbo.sysobjects WHERE name = ''##customeretvalue'' ))
        DROP TABLE ##customeretvalue    select a.stock_code as 证券代码, 
               a.stock_name as 证券名称,
               a.price as 最新价,
               sum(a.amount) as 托管数量, 
               sum(a.etvalue) as 托管市值, 
               case
                  when a.exchange_type = ''1'' then ''上海A股''
                  when a.exchange_type = ''2'' then ''深圳A股''
                  when a.exchange_type = ''D'' then ''上海B股''
                  when a.exchange_type = ''H'' then ''深圳B股''
                end 交易类别,
                rtrim(b.dict_prompt) as 股票类别
          into ##sumstocketvalue 
          from '+@customeretvalue+'  a, '+@dictionary+' b
         where (a.stock_type = b.subentry) and (dict_entry = 1206) 
      group by a.stock_code, 
               a.stock_name, 
               a.price,
               b.dict_prompt,
               a.exchange_type 
      order by a.stock_code ')
     GO
      

  5.   

    用动态sql实现吧,最好使用sp_executesql这个存储过程来实现.