表格atest的内容如下:希望能够执行表格atest里边的select语句,写了:exec('exec(''select * from atest'')'),但是仅仅是执行select * from atest ,没法执行select * from ipdata。问题1、怎么能够一次执行查找出来的select语句;
问题2、假设select * from atest出来的语句是超过8000个字符,又该怎么执行sql嵌套

解决方案 »

  1.   


    declare @tsql varchar(8000)select @tsql=sel from atestexec(@tsql)
      

  2.   

    如果@tsql 超过8000,那该肿么办
      

  3.   

    create table test(al nvarchar(1000))
    insert into test values('select * from 表名')declare @sql nvarchar(1000),@s nvarchar(1000)
    set @sql = N'select @s=al from test' 
    exec sp_executesql @sql,N'@s nvarchar(1000) output',@s output 
    exec (@s)
      

  4.   

    CREATE TABLE ipdata (id INT)
    INSERT ipdata SELECT 1
    CREATE TABLE temp(sel NVARCHAR(max))
    INSERT temp
    SELECT 'select * from ipdata' UNION ALL
    SELECT 'select * from ipdata'--#1.
    DECLARE @sql NVARCHAR(MAX) --突破8000限制
    SET @sql = N''
    SELECT @sql = @sql + sel+ CAST(';' AS NVARCHAR(MAX)) FROM temp
    EXEC(@sql)--#2.
    DECLARE @sql NVARCHAR(MAX) --突破8000限制
    SET @sql = N''
    SELECT @sql = @sql + 'EXEC(''' + sel+ CAST(''');' AS NVARCHAR(MAX)) FROM temp
    EXEC(@SQL)
      

  5.   

    如果@tsql 超过8000,那该肿么办DECLARE @sql_1 NVARCHAR(8000),@sql_2 NVARCHAR(8000)
    EXEC(@sql_1+@sql_2)
      

  6.   

    如果超过了,那就不用SQL了,用存储过程去实现,写一个个存储过程名存储在atest表中,然后调存储过程执行
      

  7.   


    declare @tsql1 varchar(8000),@tsql2 varchar(8000)
     
    select @tsql1=left(sel,8000),
           @tsql2=substring(sel,8001,8000) 
     from atest
     
    exec(@tsql1+@tsql2)
      

  8.   


    --超过8000用下边这个,max 就可以了。
    DECLARE @sql NVARCHAR(MAX)
      

  9.   

    如果你用的是SQL SERVER 2000,是的,最大4000.
    SQL SERVER 2005及以上,用NVARCHAR(MAX), 2^31-1 个字节。只不过用时,注意一下细节:
    DECLARE @test NVARCHAR(max)
    SET @test = REPLICATE(N'我', 80001)
    SELECT LEN(@test) --4000SET @test = REPLICATE(CAST(N'我' AS NVARCHAR(max)), 800000)
    SELECT LEN(@test) --800000
      

  10.   

    如果你用的是SQL SERVER 2000,是的,最大4000.
    SQL SERVER 2005及以上,用NVARCHAR(MAX), 2^31-1 个字节。只不过用时,注意一下细节:
    DECLARE @test NVARCHAR(max)
    SET @test = REPLICATE(N'我', 80001)
    SELECT LEN(@test) --4000SET @test = REPLICATE(CAST(N'我' AS NVARCHAR(max)), 800000)
    SELECT LEN(@test) --800000
    我试了下,
    declare @sql nvarchar(max) 
    declare @len int
    select  @sql=isnull(@sql + ' union all ','') + ' select * from ' + name from sysobjects where  [name] like 'abc%'
    set @len=len(@sql)
    print(@len)
    print(@sql)
    GO出来的数据长度len=43137,后面的语句截断了,不是一个完整的语句,我是哪里写漏了吗
      

  11.   


    declare @tsql1 varchar(8000),@tsql2 varchar(8000)
     
    select @tsql1=left(sel,8000),
           @tsql2=substring(sel,8001,8000) 
     from atest
     
    exec(@tsql1+@tsql2)
    整个语句窜起来是89101的字符。
      

  12.   

    工具-》选项-》查询结果-》SQL SERVER-》以网格显示结果-》检索的最多字符数:65535
    只是因为SQL SERVER不支持显示太多的字符。
      

  13.   

    工具-》选项-》查询结果-》SQL SERVER-》以网格显示结果-》检索的最多字符数:65535
    只是因为SQL SERVER不支持显示太多的字符。意思是语句是正确的,只是显示的时候只显示一半吗
      

  14.   

    一个SQL长度要超过8000,那就是设计问题了。
      

  15.   

    2楼正解,
    超过8千就不要用字符串存储了啊,BLOB吧,用的时候下载本地再解译
      

  16.   

    工具-》选项-》查询结果-》SQL SERVER-》以网格显示结果-》检索的最多字符数:65535
    只是因为SQL SERVER不支持显示太多的字符。意思是语句是正确的,只是显示的时候只显示一半吗这个确实是对的,sql server 显示结果的字符串有限制为65535个,采用len的时候就可以发现其实句子是完整的。非常感谢,散分咯