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

解决方案 »

  1.   


    有一个名为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
    两个存储过程实现的功能都是为一个表插入数据,只不过传的参数不同
    我想实现一个通用的存储过程,这个存储过程的参数为一个表名和一些要插入这个表的数值
      

  2.   

    参考简例:
    --> 生成测试数据表: [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 行受影响)
    */
      

  3.   

    我的意思是不仅仅是两个表,可以是任意个表插入数据的时候公用一个存储过程
    而且这些表里的字段个数,名称完全不同的
    表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中的字段,如果是则插入
    但是如果字段里有字符串里面也包含,或者=时,存储过程就不能用了