这个?
table
一种特殊的数据类型,用于存储结果集以供后续处理。该数据类型主要用于临时存储一组行,这些行将作为表值函数的结果集返回。语法
说明  使用 DECLARE @local_variable 声明 table 类型的变量。
table_type_definition ::=
    TABLE ( { column_definition | table_constraint } [ ,...n ] ) column_definition ::=
    column_name scalar_data_type
    [ COLLATE collation_definition ]
    [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ]
    [ ROWGUIDCOL ]
    [ column_constraint ] [ ...n ] column_constraint ::=
    { [ NULL | NOT NULL ]
    | [ PRIMARY KEY | UNIQUE ]
    | CHECK ( logical_expression )
    } table_constraint ::= 
    { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n ] )
    | CHECK ( search_condition ) 
    } 参数
table_type_definition与 CREATE TABLE 中定义表所用的信息子集相同的信息子集。表声明包括列定义、名称、数据类型和约束。允许的约束类型仅为 PRIMARY KEY、UNIQUE KEY 和 NULL。有关语法的更多信息,请参见 CREATE TABLE、CREATE FUNCTION 和 DECLARE @local_variable。collation_definition是由 Microsoft® Windows™ 区域设置和比较风格、Windows 区域设置和二进制表示法或 Microsoft SQL Server™ 排序规则组成的列的排序规则。

解决方案 »

  1.   

    表变量?--定义表变量
    declare @t table(id int,code varchar(20))--使用表变量,insert数据
    insert into @t select 1,'AAAA'
      

  2.   

    declare @t1 table(a1 int,a2 nvarchar(50))
    insert into @t1 select 1,'a'
    select @t1报错:服务器: 消息 137,级别 15,状态 2,行 8
    必须声明变量 '@t'。
      

  3.   

    declare  @opeID bigint,
    @exec_sql nvarchar(500),
    @str手术名称 nvarchar(500),
    @i int,
    @t1 table(手术ID  bigint),
    @t2 table( 手术ID bigint,  手术日期 datetime, 转流医生姓名 nvarchar(50),  科室名称 nvarchar(50), 患者姓名 nvarchar(50), 病历号 nvarchar(50),住院号  nvarchar(50),手术名称 nvarchar(100))
    if @strsql=''
    begin
    set @exec_sql=N'insert  into @t1 select 手术ID  from view_转流 '
    end
    else 
    begin
    set  @exec_sql=N'insert  into @t1 select 手术ID  from view_转流 where '+@strsql
    end
    exec  sp_executesql @exec_sql
    set @i=( select count(*) from @t1)
    while @i>0
    begin
    set @opeID=(select  top 1 手术ID from @t1)
    exec usp_curCombine 'view_转流_手术名称','手术名称','手术ID',@opeID,@str手术名称 output
    insert into @t2(手术ID,手术日期, 转流医生姓名,科室名称,患者姓名,病历号,住院号) select * from view_转流 where 手术ID=@opeID
    update @t2 set 手术名称=@str手术名称 where 手术ID=@opeID
    delete @t1 where 手术ID=@opeID
    set @i=@i-1
    end
    select *from @t2服务器: 消息 156,级别 15,状态 1,行 5
    在关键字 'table' 附近有语法错误。
    服务器: 消息 137,级别 15,状态 1,行 7
    必须声明变量 '@strsql'。
    服务器: 消息 156,级别 15,状态 1,行 11
    在关键字 'else' 附近有语法错误。
    服务器: 消息 137,级别 15,状态 1,行 13

    须声明变量 '@strsql'。
    服务器: 消息 137,级别 15,状态 1,行 16
    必须声明变量 '@t1'。
    服务器: 消息 137,级别 15,状态 1,行 19
    必须声明变量 '@t1'。
    服务器: 消息 137,级别 15,状态 1,行 21
    必须声明变量 '@t2'。
    服务器: 消息 137,级别 15,状态 1,行 22
    必须声明变量 '@t2'。
    服务器: 消息 137,级别 15,状态 1,行 23
    必须声明变量 '@t1'。
    服务器: 消息 137,级别 15,状态 1,行 26
    必须声明变量 '@t2'。
      

  4.   

    上面的回复好像没办法删除了? 
    存储过程:
    CREATE PROCEDURE [uspORIS_select视图2]
    @strsql nvarchar(500)
    AS
    declare @opeID bigint,
    @exec_sql nvarchar(500),
    @str手术名称 nvarchar(500),
    @i int
    declare @t1 table(手术ID bigint)
    declare @t2 table( 手术ID bigint, 手术日期 datetime, 转流医生姓名 nvarchar(50), 科室名称 nvarchar(50), 患者姓名 nvarchar(50), 病历号 nvarchar(50),住院号 nvarchar(50),手术名称 nvarchar(100))
    if @strsql=''
    begin
    set @exec_sql=N'insert into @t1 select 手术ID from view_转流 '
    end
    else 
    begin
    set @exec_sql=N'insert into @t1 select 手术ID from view_转流 where '+@strsql
    end
    exec sp_executesql @exec_sql
    set @i=( select count(*) from @t1)
    while @i>0
    begin
    set @opeID=(select top 1 手术ID from @t1)
    exec usp_curCombine 'view_转流_手术名称','手术名称','手术ID',@opeID,@str手术名称 output
    insert into @t2(手术ID,手术日期, 转流医生姓名,科室名称,患者姓名,病历号,住院号) select * from view_转流 where 手术ID=@opeID
    update @t2 set 手术名称=@str手术名称 where 手术ID=@opeID
    delete @t1 where 手术ID=@opeID
    set @i=@i-1
    end
    select *from @t2
    GO
    查询分析器里调试
    uspORIS_select视图2 '转流医生姓名=''医生甲'''报错
    服务器: 消息 137,级别 15,状态 2,行 1
    必须声明变量 '@t1'。(所影响的行数为 0 行)
      

  5.   

    可将函数和变量声明为 table 类型。table 变量可用于函数、存储过程和批处理中。尽可能使用表变量而不使用临时表。table 变量有以下优点: table 变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。 
    在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是,table 不能用在下列语句中:INSERT INTO table_variable EXEC 存储过程。SELECT select_list INTO table_variable 语句。在定义 table 变量的函数、存储过程或批处理结束时,自动清除 table 变量。在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。
    涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。 
    不支持在表变量之间进行赋值操作。另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。
      

  6.   

    exec sp_executesql N'insert into @t1 values(1,''a'')'这样执行exec可以吗?
    服务器: 消息 137,级别 15,状态 2,行 1
    必须声明变量 '@t1'。 总报这样的错误。
      

  7.   

    这是变量的作用域问题,表变量也是变量的一种,只能在创建它的过程中有效,而exec是开启了一个新的过程,所以在exec中无效 
    ---邹老大的原话
      

  8.   

    这是变量的作用域问题,表变量也是变量的一种,只能在创建它的过程中有效,而exec是开启了一个新的过程,所以在exec中无效 
    ---邹老大的原话
    -------精简,明了
      

  9.   

    那什么才是开始一个新的过程呢?下面的例子,select也始一个新的过程吗?
    declare @t1 table(a1 int,a2 nvarchar(50))
    insert into @t1 select 1,'a'
    select @t1报错:服务器: 消息 137,级别 15,状态 2,行 8
    必须声明变量 '@t'。
      

  10.   

    declare @t1 table(a1 int,a2 nvarchar(50))
    insert into @t1 select 1,'a'
    ---select @t1  
    select * from @t1  ---注意表变量查询时的语法....
      

  11.   

    如果本地临时表由存储过程创建或由多个       “用户”      同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。上面提到的用户指的是什么呢? 是注册SQLserver的sa用户吗?