exec('insert into B (tmID,examID) select '''+@tmID+''',examID from A')
insert into B(tmID,examID) select 1,examID from A
实际上,我的@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 的列时发生语法错误。
CREATE PROCEDURE MakePaperByCondition @tmID nvachar as insert into b(源表中所有的字段名,@tmid as '常量') select 源表中所有字段列表用逗号隔开,,@tmid as '常量'
我把你的改成这样,你测试下: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
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 设置是在执行或运行时设置,而不是在分析时设置。
select 1,examID from A
完整的语句是这样的:
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 的列时发生语法错误。
@tmID nvachar
as
insert into b(源表中所有的字段名,@tmid as '常量')
select 源表中所有字段列表用逗号隔开,,@tmid as '常量'
@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
是什么意思?
使返回的结果中不包含有关受 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 设置是在执行或运行时设置,而不是在分析时设置。