各位请帮忙,用sql server 2005/2008 job运行这段程序:IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test1]') AND type in (N'U'))
DROP TABLE [dbo].[test1]CREATE TABLE [dbo].[test1](
 [c1] [int] NULL,
 [c2] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test2]') AND type in (N'U'))
DROP TABLE [dbo].[test2]CREATE TABLE [dbo].[test2](
 [c1] [int] NULL,
 [c2] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]insert test1(c1,c2)
values(1,space(2345))insert test2
exec('select * from test1')然后检查两个表中的c2字段长度:select max(datalength(c2))
from test1
select max(datalength(c2))
from test2发现test2中c2被截短为512或1024个字符。如果在SSMS中运行上面的程序,则不会出现截短的情况。请问这是什么原因造成的啊?多谢了!

解决方案 »

  1.   

    定义的长度不够 用varchar(max)试试
      

  2.   

    -- try
    select max(len(c2)) from test1
    select max(len(c2)) from test2
      

  3.   

    可能和job有关系吧。详细原因等后来人
      

  4.   

    谢谢回复.fredrickhu - 1. text字段无定义长度之说; 2. 2345个字符远小于text字段最大长度2,147,483,647.Beirut - 1. 这个是数据丢失问题; 2. len 不可由于text
      

  5.   

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test1]') AND type in (N'U'))
    DROP TABLE [dbo].[test1]CREATE TABLE [dbo].[test1](
    [c1] [int] NULL,
    [c2] [text] NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test2]') AND type in (N'U'))
    DROP TABLE [dbo].[test2]CREATE TABLE [dbo].[test2](
    [c1] [int] NULL,
    [c2] [text] NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]insert test1(c1,c2)
    values(1,space(2345))insert test2
    exec('select * from test1')
    select max(datalength(c2))
    from test1
    select max(datalength(c2))
    from test2
    (1 行受影响)(1 行受影响)-----------
    2345(1 行受影响)
    -----------
    2345(1 行受影响)
      

  6.   

    select @@textsize 看看是否为2147483647
      

  7.   

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test1]') AND type in (N'U'))
    DROP TABLE [dbo].[test1]CREATE TABLE [dbo].[test1](
    [c1] [int] NULL,
    [c2] [text] NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test2]') AND type in (N'U'))
    DROP TABLE [dbo].[test2]CREATE TABLE [dbo].[test2](
    [c1] [int] NULL,
    [c2] [text] NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]set  TEXTSIZE 60insert test1(c1,c2)
    values(1,REPLICATE(1,80))insert test2
    exec('select * from test1')
    select * from test1select * from test2
    (1 行受影响)(1 行受影响)
    c1          c2
    ----------- ------------------------------------------------------------
    1           111111111111111111111111111111111111111111111111111111111111(1 行受影响)c1          c2
    ----------- ------------------------------------------------------------
    1           111111111111111111111111111111111111111111111111111111111111(1 行受影响)
    set  TEXTSIZE 2147483647select * from test1select * from test2c1          c2
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           11111111111111111111111111111111111111111111111111111111111111111111111111111111(1 行受影响)c1          c2
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           111111111111111111111111111111111111111111111111111111111111(1 行受影响)
      

  8.   

    ldslove兄,您好像不是在job中运行那段程序的吧?这个问题只出现在job中.
      

  9.   

    多谢ldslove兄,确实是您指出的问题。在job中,缺省TEXTSIZE 是1024或512