34,838
社区成员




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中的字段,如果是则插入
但是如果字段里有字符串里面也包含,或者=时,存储过程就不能用了
参考简例:
--> 生成测试数据表: [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 行受影响)
*/
有一个名为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
两个存储过程实现的功能都是为一个表插入数据,只不过传的参数不同
我想实现一个通用的存储过程,这个存储过程的参数为一个表名和一些要插入这个表的数值