拆成几个字符串s1、s2、s3...
然后exec(s1+s2+s3+...)

解决方案 »

  1.   

    搞错了,临时表其实后面的语句也可以用,我告诉你拆的意思是把一些东西分开,比如把一段代码放到另一存储过程中去,然后在这个存储过程中调用
    EXEC ,因为临时表还存在,不会不能用的。
      

  2.   

    我试着诉一下,还是不行,大家请看:create PROCEDURE TESTB
    AS
    exec sP_executesql N' CREATE TABLE #t(x INT PRIMARY KEY)'
    EXEC TESTC及:
    ALTER PROCEDURE TESTC
    AS 
    exec sP_executesql N'INSERT INTO #t VALUES (2)'
    exec sP_executesql N'SELECT * FROM #t'
    exec sP_executesql N'Drop table #t'运行TESTB时出错.
      

  3.   

    这种拆分时,建临时表(大家都要用的语句)当然只能在调用的主程序中,如:
    create PROCEDURE TESTB
    AS
    create table #aa ()EXEC TESTC
    select * from #aa
    go当然,在TESTC里出现#aa是不行的。
      

  4.   

    改用exec,不用SP_executesql。 
    EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )@string_variable是局部变量的名称。@string_variable 可以是 char、varchar、nchar 或 nvarchar 数据类型,最大值为服务器的可用内存。如果字符串长度超过 4,000 个字符,则把多个局部变量串联起来用于 EXECUTE 字符串。有关系统提供的 SQL Server 数据类型更多的信息,请参见数据类型。 [N]'tsql_string'是一个常量,tsql_string 可以是 nvarchar 或 varchar 数据类型。如果包含 N,则该字符串将解释为 nvarchar 数据类型,最大值为服务器的可用内存。如果字符串长度超过 4,000 个字符,则把多个局部变量串联起来用于 EXECUTE 字符串。
      

  5.   

    是的,
    EXECUTE 是可以用,但因我的存储过程有参数的.用这个方法执行效率低点.
    我本计划如果SP_executesql的问题不能解决时再用这个方法
      

  6.   

    改用临时存储过程,可以用参数。
    exec ('create PROCEDURE #TESTC AS INSERT INTO #t VALUES (2) SELECT * FROM #t Drop table #t')
    exec ('create PROCEDURE #TESTB AS CREATE TABLE #t(x INT PRIMARY KEY) EXEC #TESTC')
    exec #testb