SQL Server存储过程——带表名参数?(200分)

  • 主题发起人 xhyuanxhyuan
  • 开始时间
X

xhyuanxhyuan

Unregistered / Unconfirmed
GUEST, unregistred user!
CREATE PROCEDURE insert_studoc_maxID
( @stu_id [nvarchar](8) ,
@tablename [nvarchar]
)
AS
declare @maxID [int], @run [nvarchar]
select @maxID=max(id)+1 from studoc
set @run='identity_insert '+@tablename+' on
INSERT INTO ' +@tablename+ '
( [id], [stu_id], [date], [title], [bin], [tp], [mng], [lb])
VALUES
( @maxID,@stu_id,null,null,null,null,null,null)
'
exec(@run)
return @maxID
GO

可我再查询分析器里执行:
exec jwgl.dbo.insert_studoc_maxID t9876,studoc
时报错:
服务器: 消息 2812,级别 16,状态 62,行 1
未能找到存储过程 'i'。

我试着把set @run='identity_insert '+@tablename+' on 这行代码去掉就可以了
可我的表必须要一个标识列
请问该如何解决这个问题?
分不够再加
 
//可我的表必须要一个标识列
什么意思?标识列让它自己自增就是了,又不用你去处理的。

SET IDENTITY_INSERT dbo.Tmp_yfjh ON
GO
IF EXISTS(SELECT * FROM dbo.yfjh)
EXEC('INSERT INTO dbo.Tmp_yfjh (tdyfid, Jdid, ysyf, wlhid, wlhlb, wlhdm, yfdf, fymc, bz, jg, bl, sl, dxje, xxxc, jhbz, pc, pcarrange, quantity)
SELECT tdyfid, Jdid, ysyf, wlhid, wlhlb, wlhdm, CONVERT(varchar(2), yfdf), fymc, bz, jg, bl, sl, dxje, xxxc, jhbz, pc, pcarrange, quantity FROM dbo.yfjh (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_yfjh OFF
 
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
COMMIT

BEGIN TRANSACTION
SET IDENTITY_INSERT dbo.Tmp_yfjh ON
GO
IF EXISTS(SELECT * FROM dbo.yfjh)
EXEC('INSERT INTO dbo.Tmp_yfjh (tdyfid, Jdid, ysyf, wlhid, wlhlb, wlhdm, yfdf, fymc, bz, jg, bl, sl, dxje, xxxc, jhbz, pc, pcarrange, quantity)
SELECT tdyfid, Jdid, ysyf, wlhid, wlhlb, wlhdm, CONVERT(varchar(2), yfdf), fymc, bz, jg, bl, sl, dxje, xxxc, jhbz, pc, pcarrange, quantity FROM dbo.yfjh (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_yfjh OFF
GO
DROP TABLE dbo.yfjh
GO
EXECUTE sp_rename N'dbo.Tmp_yfjh', N'yfjh', 'OBJECT'
GO
COMMIT
 
不知你看到没有,我的存储过程里面要插入记录的表名是个变量
 
主要的问题就在这儿
 
create procedure test(@tablename varchar)
as
Exec("select * from "+@tablename)
 
TO:yayiye

你说得是对得,可是我得存储过程里面:
set @run='identity_insert '+@tablename+' on 这句过不去,如果不要这句,在别得
地方用@tablename就行
 
set @run='set identity_insert '+@tablename+' on
 
不好意思,可我改成:
set @run='set identity_insert '+@tablename+' on
还是不行的说,你们试试看嘛
 
ALTER PROCEDURE insert_studoc_maxID
( @stu_id [nvarchar](8) ,
@tablename [nvarchar](20)
)
AS
declare @maxID [nvarchar](8), @run [nvarchar](1000)<--错误在这儿
set @run='select @maxID=max(id)+1 from '+@tablename
exec(@run)

set @run='set identity_insert '+@tablename+' on
INSERT INTO ' +@tablename+ '
( [id], [gznum])
VALUES
('+ @MaxID+','''+@stu_id+''')'
exec(@run)
return @maxID
 
主要是你声明的字符变量没有显式定义长度,缺省都是一个字符
所以经过 set @run='identity_insert '+@tablename+' on
@run 实际的值是 'i' 所以提示

服务器: 消息 2812,级别 16,状态 62,行 1
未能找到存储过程 'i'。
 
CREATE PROCEDURE insert_studoc_maxID
( @stu_id [nvarchar](8) ,
@tablename [nvarchar]<----一处错
)
AS
declare @maxID [int], @run [nvarchar]<----二处错
一,@tablename [nvarchar](50)
二,@run [nvarchar](1000)
 
顶部