大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
那个t相当于把
公司专注于为企业提供网站建设、网站制作、微信公众号开发、商城开发,微信小程序定制开发,软件按需定制等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,创新互联公司更提供一系列网站制作和网站推广的服务。
select 姓名,u_sub='语文', u_score=语文 from score2 union all
select 姓名,u_sub='数学', u_score=数学 from score2
这个起了个别名
当你要用倒这个里面的字段的时候 直接t.u_sub就能用了
那就把各个值都取出来,放到变量中,然后分别插入到不同表中。
select @date = right(convert(varchar(20),birtheday,112),4),@name=name,@age=age,@birthday from inserted
@sql = ' insert into test_'+@date+' values(' + @name + ',' + @age + ',' + @birthday + ')'
当然我这个只是示例,应该注意 单引号的 增加。
sql sever2000 如何在存储过程中向虚拟表中插入数据
如题。使用如下的代码创建存储过程:
CREATE PROCEDURE prdc
@fieldCondition NVARCHAR(2000)=''
AS
BEGIN
DECLARE @sqlCmd NVARCHAR(4000)
DECLARE @tempTable TABLE(FileName nvarchar(50))
IF ISNULL(@fieldCondition,N'')=N''
SET @fieldCondition=N''
ELSE
SET @fieldCondition=N' where ('+@fieldCondition+N')'
SET @sqlCmd=N'insert into @tempTable select FileName from FileNameTable'+@fieldCondition
EXEC SP_EXECUTESQL @sqlCmd
select * from @tempTable
END
GO
其中FileNameTable表的构成如下:
FileNameTable
====================
ID FileName
1000 A
2000 B
3000 C
====================
编译存储过程是成功的,但是使用语句:exec prdc "ID='1000'" 对存储过程进行调用的时候出错,提示说变量@tempTable 也就是虚表需要声明。但是同样的代码,将@tempTable换成一个实表名进行就没有问题。求教该如何解决。
表值参数只能作为输入参数,必须带有READYONLY 关键字
因此要再申明一个变量@temp_table,将数据复制到改变量中,最后以@tempTable为标志参数调用存储过程
CREATE TYPE temptyp AS TABLE(FileName nvarchar(50))
GO
CREATE PROCEDURE prdc
@fieldCondition NVARCHAR(2000)='',
@tempTable temptyp READONLY
AS
BEGIN
DECLARE @sqlCmd NVARCHAR(4000);
DECLARE @temp_table AS temptyp;
IF ISNULL(@fieldCondition,N'')=N''
SET @fieldCondition=N'';
ELSE
SET @fieldCondition=N' where ('+@fieldCondition+N')';
SET @sqlCmd=N'insert into @temp_table select FileName from FileNameTable'+@fieldCondition;
EXEC SP_EXECUTESQL @sqlCmd;
select * from @temp_table
END
GO
EXEC prdc @tempTable=@temp_table;
--不知道结果如何,但是你应该是错在我说的问题那了
追问
尝试了一下你的代码,但是编译时提示说TYPE附近有错误,查了一下,但是没有搞好(刚学,纯菜,汗= =!),能不能帮忙再看下。现在发现就是在 "SET @sqlCmd=..."一句中对列赋别名可以执行,但是虚表在后面还是不能使用,否则还是会有原来的问题
追答
忘了告诉你了,这种写法只有sqlserver2008才支持
1 、
视图是一个虚拟表,同表一样,视图包含一系列带有名称的列和行数据。
视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。
行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
定义视图可以来自当前或其他数据库的一个或多个表,或者其他视图。
根据以上定义,所以不能使用临时表和表变量。
2、
只要是select 中有function,都会增中计算量,查询时间增长。
你说的是临时表吧?
临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。
临时表有两种类型:本地和全局。它们在名称、可见性以 及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。
例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该表,则SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。
使用全局临时表需要加上
if object_id('tempdb..##临时表') is not null
drop table ##临时表
else
creeate table ##临时表..
外键是用来实现“引用完整性”的,说白了就是一种约束,不能用来传值。
可以选择触发器或存储过程。
如果两个表字段相同可以用触发器:
CREATE TRIGGER trigger_AToB on A
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO A(a,b,c) SELECT a,b,c FROM inserted
INSERT INTO B(a,b,c) SELECT a,b,c FROM inserted
END
GO
INSERT INTO a(a,b,c)VALUES('aaa','aaa','aaa')
在查询分析器里执行上面的语句后,向A表添加数据会同时向B表添加。触发器比较方便,缺点是,一旦B表被删除了,向A表添加数据会报错。
存储过程就比较自由了:
CREATE PROC proc_InsertAToB
@a VARCHAR(10),
@b VARCHAR(20),
@c VARCHAR(30)
as
INSERT INTO A(a,b,c)VALUES(@a,@b,@c)
INSERT INTO B(a,b,c)VALUES(@a,@b,@c)
表B的字段和表A不一样也没关系,需要的话,可以再根据需要向存储过程添加参数。
使用的时候不再用INSERT INTO了,用:
EXECUTE proc_InsertAToB 'aaa','aaa','aaa'就可以。