假设有两个表 表1,表2
两个表字段个数,名称不完全相同
想用一个存储过程分别为两张表插入数据
解决方案 »
- 请高手帮助
- 关于NOT IN语句的使用,请高手帮忙,谢谢!
- SQL2005ReportService动态设置报表单元格边框问题..
- 怎么在存储过程中保留已打开的数据集?
- 如何能够根据查询的结构和数据生成一个临时表?
- 请问大家平时设计数据库时,都用什么建模工具呀?顺便散分滴
- 关于MSS server 备份数据库到异机的问题
- 外键约束和触发器是不是矛盾的?应该怎么样解决他们之间的关系?
- 在线等待高手!!一个sql server2000数据库上触发器问题!急急!!
- 事务(进程 ID 202)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
- 如何通过sql日志,查看以前执行过的sql语句
- 2000索引失效
有一个名为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
两个存储过程实现的功能都是为一个表插入数据,只不过传的参数不同
我想实现一个通用的存储过程,这个存储过程的参数为一个表名和一些要插入这个表的数值
--> 生成测试数据表: [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
GOEXEC 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 行受影响)
*/
而且这些表里的字段个数,名称完全不同的
表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中的字段,如果是则插入
但是如果字段里有字符串里面也包含,或者=时,存储过程就不能用了