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干什么了?
请高人指点一下,谢谢
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干什么了?
请高人指点一下,谢谢
有这个必要吗,表的列名可以到系统表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,如果要极联删除,设置ON DELETE CASCADE 。参见联机丛书。
3,企业管理器,sql server组,新建sql server注册.
4,这个不是很清楚,应该是36B记录行信息,偏移量之类的东西吧。
而且主键会多占几B的,例如你一行的尺寸为8000B,主键为int型,则实际上要占用8000B+7B=8007B
关于第一个问题,我自有我的用处。syscolumns表里得到列名我知道怎么做。关键是如何给据表的列数,来批量定义变量。
我主要想知道这个。
SQL Server没有“批量定义变量”的功能,不怕麻烦的话,自己手动做吧
你的想法与外键的约束有冲突,所以如果想实现你的想法,就不能定义外键约束,改用触发器实现级联更新的功能以及“那么如果我从table_folk中删除一行,而在table_student中置为空值”的功能
约束不能实现.第一个问题.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
谢谢,刚开始确实没有搞清楚你的意思。
如果你是想使 变量个数不固定和表字段一致
那么你可以查出字段总数然后用动态SQL声明 或者循环申明
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
14楼不是写给你了吗?EXEC(@s)就执行就声明了,不过在动态语句内.
where id = object_id(N'tablename')
第一个问题、批量定义多个变量,来存储表的列名。现在可以使用循环定义多个变量,但是要使用这些变量来保存列名,还没有搞出来。昨天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行呢?
我不知道这么理解对不对?
笔误,8K=8192
减掉96B的头字节,剩下8096B