如题

解决方案 »

  1.   

    create proc GetInfo()
    (
      参数1 nvarchar(100),
      最大的参数 ntext 
    )
    as
    ...
      

  2.   

    我有两个存储过程A和B,把A当着一个参数传到B中去执行,而A的长度大于8000,报错了
      

  3.   

    存储过程A的内容在一个文本文件中写着,存储过程B是专门执行sql语句的,而且存储过程B使用的地方很多,所以修改的时候要慎重
      

  4.   

    如下:  表结构:  字段名     id   title   content  类型      int   char(200)  text  Insert Into News (title,content) Values (@title,@content)  实际上这样插入是不能超过8000字节的(content字段)。SqlServer在这方面做了限制。  可以这样插入CREATE PROCEDURE NewsInsert  @title char(200),@content text  AS
      
    Insert Into News (title,content) Values (@title,'')
      
    DECLARE @ptrval binary(16)
    SELECT @ptrval = TEXTPTR(content)
    FROM News
    WHERE id = @@identity
    writeTEXT News .content @ptrval @content
      
    GO  用到了writeTEXT函数。  注意:插入的时候Insert Into News (title,content) Values (@title,'')一定要有content值对应空,不能让content是null状态.否则下面的无法找到地址。  更新的时候:CREATE PROCEDURE NewsInsert  @title char(200),@content text,@id int  AS
      
    Update News Set title = @title,content='' Where id = @id --注意content=''虽然不起作用,但是最好写上,避免content有null的情况
      
    DECLARE @ptrval binary(16)
    SELECT @ptrval = TEXTPTR(content)
    FROM News
    WHERE id = @id
    writeTEXT News .content @ptrval @content
      
    GO  读取和删除的时候一切正常,就不多叙述了。  以上用法可以插入数据库类型Text对应的理论实际长度以内。
      

  5.   

    化解字符串不能超过8000的方法 
    /*--化解字符串不能超过8000的方法 经常有人提到,用动态生成SQL语句的方法处理数据时,处理语句超长,无法处理的问题,下面就讨论这个问题:测试环境:--以系统表 syscolumns 为测试数据,要求按xtype为列字段,name为行字段,统计colid的和--要求结果xtype    filedname_1    fieldname_2    .....    fieldname_n-------- -------------- -------------- -------- --------------34       0              0              .....    1--*/ /*--常规处理方法(不加行数限制会因生成的字符串益出而出错)set rowcount 10--因为syscolumns的记录较大,会导致生成的字符串溢出,所以限制一下行数 declare @s nvarchar(4000)set @s=''select @s=@s+N','+quotename([name])+N'=sum(case name when '+quotename([name],'''')+N' then [colid] else 0 end)'from(select distinct [name] from [syscolumns]) a set rowcount 0--取消限制exec(N'select [xtype]'+@s+N' from [syscolumns] group by [xtype]') /*--问题不加行数限制时,会因生成的字符串益出而出错--*/--*/ /*--方法1. 多个变量处理 --根据查询结果定义变量(实际处理中,应该是估计需要多少个变量,定义足够多的变量个数,多定义变量并不影响处理,下面就多定义了一个)--生成数据处理临时表SELECT id=IDENTITY(int,0,1),g=0,a=CAST(N','+QUOTENAME([name])+N'=SUM(CASE [name] WHEN N'+QUOTENAME(name,N'''')+N' THEN [colid] ELSE 0 END)'as nvarchar(4000))INTO # FROM syscolumnsWHERE name>N''GROUP BY name --分组临时表UPDATE a SET G=id/iFROM # a,(SELECT i=3800/MAX(LEN(a)) FROM #)bSELECT MAX(g)+1 as N'需要的变量个数' FROM # DECLARE @0 nvarchar(4000),@1 nvarchar(4000),@2 nvarchar(4000),@3 nvarchar(4000),@4 nvarchar(4000)SELECT @0=N'',@1=N'',@2=N'',@3=N'',@4=N''SELECT @0=CASE g WHEN 0 THEN @0+a ELSE @0 END,@1=CASE g WHEN 1 THEN @1+a ELSE @1 END,@2=CASE g WHEN 2 THEN @2+a ELSE @2 END,@3=CASE g WHEN 3 THEN @3+a ELSE @3 END,@4=CASE g WHEN 4 THEN @4+a ELSE @4 ENDFROM #EXEC(N'SELECT xtype'+@0+@1+@2+@3+@4+N' FROM syscolumns GROUP BY xtype')DROP TABLE # /*--方法说明 优点:比较灵活,数据量大时只需要增加变量就行了.不用改动其他部分缺点:要自行估计处理的数据,估计不足就会出错--*/--*/ /*--方法2. bcp+isql --因为要用到bcp+isql,所以需要这些信息declare @servername sysname,@username sysname,@pwd sysnameselect @servername=@@servername  --服务器名,@username=N''           --用户名,@pwd=N''                --密码 declare @tbname sysname,@s nvarchar(4000) --创建数据处理临时表set @tbname=quotename(N'##temp_'+cast(newid() as varchar(36)))set @s=N'create table '+@tbname+'(a nvarchar(4000))insert into '+@tbname+N'select N''create view '+stuff(@tbname,2,2,N'')+N' as select [xtype]''union allselect N'',''+quotename([name])+''=sum(case [name] when N''+quotename([name],'''''''')+'' then [colid] else 0 end)''from(select distinct [name] from [syscolumns] where name<>N''xtype'')aunion allselect N''from [syscolumns] group by [xtype]'''exec(@s) --生成创建视图的文件,注意使用了文件:c:\temp.txtset @s=N'bcp "'+@tbname+N'" out "c:\'+@tbname+N'" /S"'+@servername+N'" /U"'+@username+N'" /P"'+@pwd+N'" /w'exec master..xp_cmdshell @s,no_output --调用isql生成数据处理视图set @s=N'osql /S"'+@servername+case when @username=N'' then N'" /E' else N'" /U"'+@username+N'" /P"'+@pwd+N'"'end+N' /d"'+db_name()+N'" /i"c:\'+@tbname+'"'exec master..xp_cmdshell @s,no_output --删除临时文件set @s=N'del "c:\'+@tbname+'"'exec master..xp_cmdshell @s,no_output --调用视图,显示处理结果set @s=N'drop table '+@tbname+N'select * from '+stuff(@tbname,2,2,N'')+N'drop view '+stuff(@tbname,2,2,N'')exec(@s) /*--方法总结 优点:程序自动处理,不存在判断错误的问题缺点:复杂,经过的步骤多,容易出错,而且需要一定的操作员权限--*/--*/ --/*-- 方法3. 多个变量处理,综合了方法1,2的优点,解决了方法1中需要人为判断,增加变量的问题,排除了方法2,需要权限和过程复杂的问题DECLARE @sqlhead nvarchar(4000),@sqlend nvarchar(4000),@sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000),@i int,@ic nvarchar(10) --生成数据处理临时表SELECT id=IDENTITY(int,0,1),g=0,a=CAST(N','+QUOTENAME([name])+N'=SUM(CASE [name] WHEN N'+QUOTENAME(name,N'''')+N' THEN [colid] ELSE 0 END)'as nvarchar(4000))INTO # FROM(SELECT DISTINCT name FROM [syscolumns] WHERE name>N'')a --分组临时表UPDATE a SET @i=id/i,g=@iFROM # a,(SELECT i=3800/MAX(LEN(a)) FROM #)bSET @ic=@i --生成数据处理语句SELECT @sqlhead=N''''+REPLACE(N'SELECT [xtype]',N'''',N'''''')+'''',@sqlend=N''''+REPLACE(N' FROM [syscolumns] GROUP BY [xtype]',N'''',N'''''')+N'''',@sql1=N'',@sql2=N'',@sql3=N'',@sql4=N''WHILE @ic>=0SELECT @sql1=N',@'+@ic+N' nvarchar(4000)'+@sql1,@sql2=N',@'+@ic+N'=N'''''+@sql2,@sql3=N',@'+@ic+N'=CASE g WHEN '+@ic+N' THEN @'+@ic+N'+a ELSE @'+@ic+N' END'+@sql3,@sql4=N'+@'+@ic+@sql4,@ic=@ic-1SELECT @sql1=STUFF(@sql1,1,1,N''),@sql2=STUFF(@sql2,1,1,N''),@sql3=STUFF(@sql3,1,1,N''),@sql4=STUFF(@sql4,1,1,N'') --执行EXEC(N'DECLARE '+@sql1+N'SELECT '+@sql2+N'SELECT '+@sql3+N' FROM #EXEC(N'+@sqlhead+N'+'+@sql4+N'+N'+@sqlend+N')')--删除临时表DROP TABLE # /*--方法总结 总结了前两种方法的优点,自动判断需要处理的变量数--*/--*/
      

  6.   

    用不着这么复杂,我知道你的意思是要定义的sql语句超8000了,可以用以下方式例:
    declare @sql nvarchar(max)
     set @sql='select a1.党员总计,b1.女党员总计,c1.少数民族总计,d1.三五及以下总计,e1.三六岁至五九岁总计,f1.六十及以上总计,g1.研究生及以上总计,h1.本科总计,i1.大专总计,j1.中专总计,k1.高中中技总计,l1.初中及以下总计
    ,a2.党员在岗职工,b2.女党员在岗职工,c2.少数民族在岗职工,d2.三五及以下在岗职工,e2.三六岁至五九岁在岗职工,f2.六十及以上在岗职工,g2.研究生及以上在岗职工,h2.本科在岗职工,i2.大专在岗职工,j2.中专在岗职工,k2.高中中技在岗职工,l2.初中及以下在岗职工
    ,a3.党员公有合计,b3.女党员公有合计,c3.少数民族公有合计,d3.三五及以下公有合计,e3.三六岁至五九岁公有合计,f3.六十及以上公有合计,g3.研究生及以上公有合计,h3.本科公有合计,i3.大专公有合计,j3.中专公有合计,k3.高中中技公有合计,l3.初中及以下公有合计
    ,a4.党员公务员,b4.女党员公务员,c4.少数民族公务员,d4.三五及以下公务员,e4.三六岁至五九岁公务员,f4.六十及以上公务员,g4.研究生及以上公务员,h4.本科公务员,i4.大专公务员,j4.中专公务员,k4.高中中技公务员,l4.初中及以下公务员
    ,a5.党员机关工作人员,b5.女党员机关工作人员,c5.少数民族机关工作人员,d5.三五及以下机关工作人员,e5.三六岁至五九岁机关工作人员,f5.六十及以上机关工作人员,g5.研究生及以上机关工作人员,h5.本科机关工作人员,i5.大专机关工作人员,j5.中专机关工作人员,k5.高中中技机关工作人员,l5.初中及以下机关工作人员
    ,a6.党员事业单位管理技术人员,b6.女党员事业单位管理技术人员,c6.少数民族事业单位管理技术人员,d6.三五及以下事业单位管理技术人员,e6.三六岁至五九岁事业单位管理技术人员,f6.六十及以上事业单位管理技术人员,g6.研究生及以上事业单位管理技术人员,h6.本科事业单位管理技术人员,i6.大专事业单位管理技术人员,j6.中专事业单位管理技术人员,k6.高中中技事业单位管理技术人员,l6.初中及以下事业单位管理技术人员
    ,a7.党员参照法事业单位人员,b7.女党员参照法事业单位人员,c7.少数民族参照法事业单位人员,d7.三五及以下参照法事业单位人员,e7.三六岁至五九岁参照法事业单位人员,f7.六十及以上参照法事业单位人员,g7.研究生及以上参照法事业单位人员,h7.本科参照法事业单位人员,i7.大专参照法事业单位人员,j7.中专参照法事业单位人员,k7.高中中技参照法事业单位人员,l7.初中及以下参照法事业单位人员
    ,a8.党员公有企业管理技术人员,b8.女党员公有企业管理技术人员,c8.少数民族公有企业管理技术人员,d8.三五及以下公有企业管理技术人员,e8.三六岁至五九岁公有企业管理技术人员,f8.六十及以上公有企业管理技术人员,g8.研究生及以上公有企业管理技术人员,h8.本科公有企业管理技术人员,i8.大专公有企业管理技术人员,j8.中专公有企业管理技术人员,k8.高中中技公有企业管理技术人员,l8.初中及以下公有企业管理技术人员
    ,a9.党员公有工人,b9.女党员公有工人,c9.少数民族公有工人,d9.三五及以下公有工人,e9.三六岁至五九岁公有工人,f9.六十及以上公有工人,g9.研究生及以上公有工人,h9.本科公有工人,i9.大专公有工人,j9.中专公有工人,k9.高中中技公有工人,l9.初中及以下公有工人
    ,a10.党员非公合计,b10.女党员非公合计,c10.少数民族非公合计,d10.三五及以下非公合计,e10.三六岁至五九岁非公合计,f10.六十及以上非公合计,g10.研究生及以上非公合计,h10.本科非公合计,i10.大专非公合计,j10.中专非公合计,k10.高中中技非公合计,l10.初中及以下非公合计
    ,a11.党员非公企业管理技术人员,b11.女党员非公企业管理技术人员,c11.少数民族非公企业管理技术人员,d11.三五及以下非公企业管理技术人员,e11.三六岁至五九岁非公企业管理技术人员,f11.六十及以上非公企业管理技术人员,g11.研究生及以上非公企业管理技术人员,h11.本科非公企业管理技术人员,i11.大专非公企业管理技术人员,j11.中专非公企业管理技术人员,k11.高中中技非公企业管理技术人员,l11.初中及以下非公企业管理技术人员
    ,a12.党员非公民办非企业,b12.女党员非公民办非企业,c12.少数民族非公民办非企业,d12.三五及以下非公民办非企业,e12.三六岁至五九岁非公民办非企业,f12.六十及以上非公民办非企业,g12.研究生及以上非公民办非企业,h12.本科非公民办非企业,i12.大专非公民办非企业,j12.中专非公民办非企业,k12.高中中技非公民办非企业,l12.初中及以下非公民办非企业
    ,a13.党员非公工人,b13.女党员非公工人,c13.少数民族非公工人,d13.三五及以下非公工人,e13.三六岁至五九岁非公工人,f13.六十及以上非公工人,g13.研究生及以上非公工人,h13.本科非公工人,i13.大专非公工人,j13.中专非公工人,k13.高中中技非公工人,l13.初中及以下非公工人
    ,a14.党员农牧渔民,b14.女党员农牧渔民,c14.少数民族农牧渔民,d14.三五及以下农牧渔民,e14.三六岁至五九岁农牧渔民,f14.六十及以上农牧渔民,g14.研究生及以上农牧渔民,h14.本科农牧渔民,i14.大专农牧渔民,j14.中专农牧渔民,k14.高中中技农牧渔民,l14.初中及以下农牧渔民
    ,a15.党员军人武警,b15.女党员军人武警,c15.少数民族军人武警,d15.三五及以下军人武警,e15.三六岁至五九岁军人武警,f15.六十及以上军人武警,g15.研究生及以上军人武警,h15.本科军人武警,i15.大专军人武警,j15.中专军人武警,k15.高中中技军人武警,l15.初中及以下军人武警
    ,a16.党员学生,b16.女党员学生,c16.少数民族学生,d16.三五及以下学生,e16.三六岁至五九岁学生,f16.六十及以上学生,g16.研究生及以上学生,h16.本科学生,i16.大专学生,j16.中专学生,k16.高中中技学生,l16.初中及以下学生
    ,a17.党员其他,b17.女党员其他,c17.少数民族其他,d17.三五及以下其他,e17.三六岁至五九岁其他,f17.六十及以上其他,g17.研究生及以上其他,h17.本科其他,i17.大专其他,j17.中专其他,k17.高中中技其他,l17.初中及以下其他
     from(select * from t1)a1,.....'
    exec sp_executesql @sql关键是以上代码中的标注为红色的,这样就可以正确执行了,但仅限于sqlserver2005,sqlserver2000没有类似方法。