CREATE PROCEDURE MakePaperByCondition
@tmID int
as 
insert into B(tmID,examID)  
select @tmID,examID from A

解决方案 »

  1.   

    exec('insert into B (tmID,examID) select '''+@tmID+''',examID from A')
      

  2.   

    insert into B(tmID,examID) 
    select 1,examID from A
      

  3.   

    实际上,我的@vsql是一个很长的语句,因为怕大家很难看,就把它简化了.
    完整的语句是这样的:
    CREATE PROCEDURE MakePaperByCondition
    @TkjID int,
    @SingleNum int,
    @MultiNum int,
    @ExamID int
    ASdeclare @vsql varchar(1000)
    set @vsql='select  ItemID,  '+@ExamID+' 
    from(
    select * from(
    select top '+convert(varchar,@SingleNum)+' aa=newid(),* from Exam_tm  where  tm_type='+'''单选题'''+' order by aa
    )a
              union all
    select * from(
    select top '+convert(varchar,@MultiNum)+'  aa=newid(),* from Exam_tm 
    where tm_type='+'''多选题'''+' order by aa
    )b
    )a where tkjchildid='+convert(varchar,@TkjID)insert into Exampaper(ItemID,ExamID)  exec(@vsql)
    GO
    指示: varchar 值 'select  ItemID,  ' 
    转换为数据类型为 int 的列时发生语法错误。
      

  4.   

    CREATE PROCEDURE MakePaperByCondition
    @tmID nvachar
    as 
    insert into b(源表中所有的字段名,@tmid as '常量')
    select 源表中所有字段列表用逗号隔开,,@tmid as '常量'
      

  5.   

    我把你的改成这样,你测试下:CREATE PROCEDURE MakePaperByCondition
    @TkjID varchar(10),
    @SingleNum varchar(10),
    @MultiNum varchar(10),
    @ExamID varchar(10) ---全部定义为字符型
    AS
    begin
    set nocount on
    insert into Exampaper(ItemID,ExamID)
    exec ('select  ItemID,  '''+@ExamID+''' from(
    select * from(
    select top '+@SingleNum+'  aa=newid(),* from Exam_tm  where  tm_type=''单选题'' order by aa
    )a
              union all
    select * from(
    select top '+@MultiNum+'  aa=newid(),* from Exam_tm 
    where tm_type=''多选题''  order by aa
    )b
    )c where tkjchildid='''+@TkjID)+'''
    ')
    set nocount off
    end
      

  6.   

    谢谢vinsonshen(有空多来,努力升星~~), 成功了.请问set nocount on/off
    是什么意思?
      

  7.   

    还有一个问题,改成现在这个样子后,如果TkjID的值很大,会不会有问题?
      

  8.   

    SET NOCOUNT
    使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。语法
    SET NOCOUNT { ON | OFF }注释
    当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"nn rows affected"。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
      

  9.   

    “还有一个问题,改成现在这个样子后,如果TkjID的值很大,会不会有问题?”--------------------int从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。那你把varchar长度定义到int的最大值长度就能解决啦