(高手请进)存储过程动态插入表

dryzha 2010-11-02 01:44:54

假设有两个表 表1,表2
两个表字段个数,名称不完全相同
想用一个存储过程分别为两张表插入数据

...全文
112 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kiruya0 2010-11-02
if判断下参数就可以了嘛
回复
dryzha 2010-11-02
[Quote=引用 7 楼 htl258 的回复:]
如果字段数目不同,需要根据具体情况来确定,得把需求再细化,在过程内要加入条件判断。
[/Quote]
我的意思是不仅仅是两个表,可以是任意个表插入数据的时候公用一个存储过程
而且这些表里的字段个数,名称完全不同的
表1 有字段a,b,c, 表2有字段d,e,f,g,h
表3 有5个字段,表4有10个字段
这个存储过程的参数是固定的,不能将表1,2,3,4中的所有字段作为参数,
我是这样写的

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
Create PROCEDURE [dbo].[TestAdd]
@Table Varchar(100),
@Colums NVARCHAR(4000)
AS
BEGIN
DECLARE @Temp table
(
ColumsName Varchar(128)
)
INSERT INTO @Temp SELECT Name FROM SysColumns WHERE id=Object_Id(@Table)
IF (SELECT COUNT(*) FROM @Temp )<=0
SELECT -11
ELSE
BEGIN
DECLARE @TableColums VARCHAR(2000),@ColumValues nvarchar(1000)
DECLARE @i INT
SET @TableColums=''
SET @ColumValues=''
SET @Colums=RTRIM(LTRIM(@Colums))
SET @i=CHARINDEX(',',@Colums)
WHILE @i>=1
BEGIN
DECLARE @str nvarchar(2000),@singleColum nvarchar(200)
SET @str=(LEFT(@Colums,@i-1))
set @singleColum=(LEFT(@str,CHARINDEX('=',@str)-1))
IF exists(SELECT * FROM @Temp WHERE ColumsName=@singleColum)
set @TableColums=@TableColums+','+@singleColum
set @ColumValues=@ColumValues+','+right(@str,CHARINDEX('=',@str)+1)
SET @Colums=SUBSTRING(@Colums,@i+1,LEN(@Colums)-@i)
SET @i=CHARINDEX(',',@Colums)
end
END
END
@Table为要插入的表名,@Colums 为要插入@Table表的字符拼接 如'a=100,b=3000,c=''asdf'''
存储过程里用,分隔取值。再用=分隔取值,前部分为字段名,后部分为数值
再判断字段名是否为表@Table中的字段,如果是则插入
但是如果字段里有字符串里面也包含,或者=时,存储过程就不能用了

回复
htl258_Tony 2010-11-02
如果字段数目不同,需要根据具体情况来确定,得把需求再细化,在过程内要加入条件判断。
回复
htl258_Tony 2010-11-02
参考简例:


--> 生成测试数据表: [a]
IF OBJECT_ID('[a]') IS NOT NULL
DROP TABLE [a]
GO
CREATE TABLE [a] ([id] [int],[name] [nvarchar](10))

--> 生成测试数据表: [b]
IF OBJECT_ID('[b]') IS NOT NULL
DROP TABLE [b]
GO
CREATE TABLE [b] ([id] [int],[name] [nvarchar](10))

IF OBJECT_ID('p_test')>0
DROP PROC p_test
GO
CREATE PROC p_test
@tb SYSNAME,
@id INT,
@name NVARCHAR(10)
AS
DECLARE @s NVARCHAR(100)
SET @s='INSERT '+@tb+' VALUES(@id,@name)'
EXEC sp_executesql @s,N'@id int,@name nvarchar(10)',@id,@name
GO

EXEC p_test 'a',1,'aa'
EXEC p_test 'a',2,'bb'
EXEC p_test 'b',1,'cc'
EXEC p_test 'b',2,'dd'

SELECT * FROM a
/*
id name
----------- ----------
1 aa
2 bb

(2 行受影响)
*/
SELECT * FROM b
/*
id name
----------- ----------
1 cc
2 dd

(2 行受影响)
*/
回复
dryzha 2010-11-02

有一个名为article的表,插入数据的存储过程为
CREATE PROCEDURE [dbo].[ArticleAdd]
@Title nvarchar(50)='''',
@Content ntext='''',
@BoardID int=0,
@Pic varchar(128)='''',
@Type tinyint=0,
AS
BEGIN

INSERT INTO Article(Title,Content,BoardID,Type)
VALUES(@Title,@Content,@BoardID,@Type)
SELECT @ID=SCOPE_IDENTITY()

END
有一个名为Thread的表,插入数据的存储过程为
CREATE PROCEDURE [dbo].[TheardAdd]
@Color varchar(50)='''',
@Action tinyint,
@UserID int=0,
@Author nvarchar(50)='''',
@Source nvarchar(50)='''',
@KeyWord nvarchar(1000) = '''',
@PublishDate datetime=''2007-01-01'',
@Status tinyint=1
AS
BEGIN

INSERT INTO Theard(Color,UserID,Author,Source,PublishDate,Status,KeyWord,LangID)
VALUES(@Color,@UserID,@Author,@Source,@PublishDate,@Status,@KeyWord,@LangID)
SELECT @ID=SCOPE_IDENTITY()

END
两个存储过程实现的功能都是为一个表插入数据,只不过传的参数不同
我想实现一个通用的存储过程,这个存储过程的参数为一个表名和一些要插入这个表的数值

回复
--小F-- 2010-11-02
不明白意思
回复
fengyun142415 2010-11-02
那就在存储过程里写语句分别往两个表插数据就行了,有什么特殊的要求吗
回复
brownhwy 2010-11-02
这样的问题也说的太不清楚了,不知想做什么?
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2010-11-02 01:44
社区公告
暂无公告