1、根据一个表的列数如何批量定义一组变量,用来存储某个表的列名?例如tableA有四个列,那么定义四个变量column1,column2,column3,column4,来存储tableA的每个列名。
2、如何一起使用on update和on delete 选项。例如:table_student表中引用了table_folk的folk_no列,即folk_no为table_student的外键,现在想更新table_folk的folk_no时级联更新table_student表中的folk_no列,删除时对table_student不做任何动作。
我在table_student使用constraint r_folk_no foreign key (folk_no) refrences table_folk(folk_no) on update cascade on delete no action后,级联更新可以实现,但是从table_folk删除一行时不让删除。
3、在sql server中如何注册另外一个服务器?
4、MS SQL server中数据存贮的主要单元是页面,大小为8K,每个页面都有一个96字节的头,用于存储系统信息,数据行紧随其后,一行不能跨越两个页面,所以每行的最大尺寸为8060字节,为什么不是8196B,我是这么计算的:8K=8192-96(头字节)=8196,为什么是8060,那么另外的36B干什么了?
请高人指点一下,谢谢

解决方案 »

  1.   

    1、根据一个表的列数如何批量定义一组变量,用来存储某个表的列名?例如tableA有四个列,那么定义四个变量column1,column2,column3,column4,来存储tableA的每个列名。 
    有这个必要吗,表的列名可以到系统表syscolumns查找,一般不必自己定义变量了2、如何一起使用on update和on delete 选项。例如:table_student表中引用了table_folk的folk_no列,即folk_no为table_student的外键,现在想更新table_folk的folk_no时级联更新table_student表中的folk_no列,删除时对table_student不做任何动作。 
    我在table_student使用constraint r_folk_no foreign key (folk_no) refrences table_folk(folk_no) on update cascade on delete no action后,级联更新可以实现,但是从table_folk删除一行时不让删除。 on delete no action的意思就是不要级联删除,那当然不让删除了
      

  2.   

    4、MS SQL server中数据存贮的主要单元是页面,大小为8K,每个页面都有一个96字节的头,用于存储系统信息,数据行紧随其后,一行不能跨越两个页面,所以每行的最大尺寸为8060字节,为什么不是8196B,我是这么计算的:8K=8192-96(头字节)=8196,为什么是8060,那么另外的36B干什么了? 在页尾有一个行偏移表。在行偏移表中,页上的每一行都有一个条目,每个条目记录那一行的第一个字节与页首的距离。行偏移表中的条目序列与页中行的序列相反。
      

  3.   

    3、在sql server中如何注册另外一个服务器? 不知道说的是联结服务器还是企业管理器的注册,建议多看看联机帮助
      

  4.   

    3、在sql server中如何注册另外一个服务器?  企业管理器的注册,
      

  5.   

    1,可以用动态语句实现,从syscolumns表里得到列名,并定义,不过如haiwer所说,没有意义。
    2,如果要极联删除,设置ON DELETE CASCADE 。参见联机丛书。
    3,企业管理器,sql server组,新建sql server注册.
    4,这个不是很清楚,应该是36B记录行信息,偏移量之类的东西吧。
      

  6.   


    而且主键会多占几B的,例如你一行的尺寸为8000B,主键为int型,则实际上要占用8000B+7B=8007B
      

  7.   

    to haiwer
    关于第一个问题,我自有我的用处。syscolumns表里得到列名我知道怎么做。关键是如何给据表的列数,来批量定义变量。
    我主要想知道这个。
      

  8.   

    另,我不想级联删除。那么如果我从table_folk中删除一行,而在table_student中置为空值,或者值不变怎么做?
      

  9.   


    SQL Server没有“批量定义变量”的功能,不怕麻烦的话,自己手动做吧
      

  10.   


    你的想法与外键的约束有冲突,所以如果想实现你的想法,就不能定义外键约束,改用触发器实现级联更新的功能以及“那么如果我从table_folk中删除一行,而在table_student中置为空值”的功能
      

  11.   


    约束不能实现.第一个问题.CREATE TABLE tx(id INT,v VARCHAR(10),d DATETIME,n DECIMAL(9,4),f FLOAT)
    GODECLARE @s VARCHAR(8000)SELECT @s=ISNULL(@s + CHAR(10)+CHAR(13),'') + 'DECLARE @' + c.Name + ' ' + t.Name

    CASE 
    WHEN t.Name IN('char','varchar','nvarchar','nchar') THEN '(' + RTRIM(c.Length) + ')'
    WHEN t.Name IN('number','decimal') THEN '(' + RTRIM(c.xprec) +',' + RTRIM(c.xscale) + ')'
    ELSE ''
    END
      FROM syscolumns c
    INNER JOIN master..systypes t
    ON c.xusertype=t.xusertype
    WHERE id=OBJECT_ID('tx')
    PRINT @s
    --EXEC(@s)/*
    DECLARE @id int
    DECLARE @v varchar(10)
    DECLARE @d datetime
    DECLARE @n decimal(9,4)
    DECLARE @f float
    */GODROP TABLE tx
    GO
      

  12.   

    大家都没有搞清我想要什么。对于第一个问题,我想知道怎么样,批量声明一组变量,column1,column2,column3,column4,变量的个数由该表列的个数决定
      

  13.   

    to fcuandy
    谢谢,刚开始确实没有搞清楚你的意思。
      

  14.   

    fcuandy  的意思是系统表里面有!你自己能及时地查出这些表字段!没必要申明变量!
    如果你是想使 变量个数不固定和表字段一致
    那么你可以查出字段总数然后用动态SQL声明  或者循环申明
      

  15.   

    3、在sql server中如何注册另外一个服务器? --服务器注册器
    if not exists(select * from master..sysservers where srvname='OP' )   
    begin
      exec   sp_addlinkedserver     'OP','','SQLOLEDB','服务器IP地址'  --链接服务器注册器 
      exec   sp_addlinkedsrvlogin   'OP','false',null,'sa','saPassword' --服务器登录帐号注册器
    end
    go
      

  16.   


    14楼不是写给你了吗?EXEC(@s)就执行就声明了,不过在动态语句内.
      

  17.   

    select name from syscolumns where id = object_id(N'tb_name') 
      

  18.   

    select syscolumns.name, systypes.name datatype,syscolumns.length from syscolumns inner join systypes on syscolumns.xtype=systypes.xtype 
    where id = object_id(N'tablename')
      

  19.   

    回复一下学习结果:
        第一个问题、批量定义多个变量,来存储表的列名。现在可以使用循环定义多个变量,但是要使用这些变量来保存列名,还没有搞出来。昨天fcuandy 给我说,这个好像不能实现(我这么理解的)。自己反思了一下,确实是比较难啊。对自己也产生了怀疑,难道我真的错了。
         下面给出根据列明来定义多个变量的程序,自己写的(有错误的,请大家指点下):
      create procedure del_row
     @table_name char(20)
    as
      begin
        declare @count int,@table_id int,@i int
        set @i=1
        if exists(select * from sysobjects where name=@table_name and type='u')
          begin 
           set @table_id=(select id from sysobjects where name=@table_name and type='u')
            select @count=count(*) from syscolumns where id=@table_id
            
            while (@i<@count+1)
               begin
                   declare @column char(10)
                   set @str='declare @'+'column'+cast(@i as char)+'char(20)'              
                   set @i=@i+1
               end
           end
         else
           print '数据库中没有该表,请检查表名是否正确'
       end
    但现在的问题是怎么使用这写变量,来存储表的列名呢?我继续不下去了,请大家帮忙。
    第二个问题,已经搞清楚了,以前没有弄明白no action的含义,回炉学习后,no action的含义是如果试图删除/修改某行,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚 DELETE/Update
    我要实现的只能用触发器才能实现:下面是代码:
       create trigger t_folk_no
    on dic_folk
    after delete,update
    as
    if update(folk_no)
       update table_student_basic_info
       set table_student_basic_info.folk_no=(select folk_no from inserted)
       where folk_no=(select folk_no from deleted)
    else 
       update table_student_basic_info
       set table_student_basic_info.folk_no=null
       where folk_no=(select folk_no from deleted)
       
    3、还没有解决,不知道该怎么办,使用‘新建sql server注册’在’选择可用的服务器‘这块该怎么弄,输入自己计算机的IP地址可以创建,那么输入其他的计算机名或者IP地址就不行了。有办法解决吗?要不是我对sql server还没有吃透?
    4、在页尾是有一个偏移表,记录表中每行的在页中的偏移量,每行有两个字节,一个记录行数,一个记录在页中的偏移量。那么这个偏移表的大小是固定的呢(36B),还是变化的?如果是固定的话,那么该页中只有一行,即偏移表中只需要两个字节,那剩下的34B呢?如果是固定的,那是不是意味着每页最多只能是16行呢? 
    我不知道这么理解对不对?
      

  20.   


    笔误,8K=8192
    减掉96B的头字节,剩下8096B