首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

100分。存储过程的有关问题 ,请

2012-01-19 
100分。存储过程的问题 ,请高手进想写一个存储过程,内容是现有一个存储过程假如叫SP_tool,该存储过程接受一

100分。存储过程的问题 ,请高手进
想写一个存储过程,内容是现有一个存储过程假如叫SP_tool,该存储过程接受一个参数,如果传入参数叫TA,那么执行一个查找操作,在当前数据库中查找有没有名字叫TA的表,如果有   就自动建立一个存储过程对该表进行插入工作。如果没有这个名称的表就显示无此表。我朋友以前发过帖子,有人回复了,但是不是很懂   ,请解释下,最好每行都说下。最好的   我给90分,谢谢大家   帮帮忙!!!!!!!
sql   语句如下:


create   proc   dbo.SP_tool  
          @tablename   varchar(50)
AS
  if   exists(select   1   from   sysobjects   where   name=@tablename   and   xtype= 'u ')
      begin
          exec   AutoGeneration_IUD_P   @tablename, '1 '     --插入
          exec   AutoGeneration_IUD_P   @tablename, '2 '     --更新
          exec   AutoGeneration_IUD_P   @tablename, '3 '     --刪除
      end

GO


/*附通用存儲過程   AutoGeneration_IUD_P   */

/*   作者:   zlp321002(行走江湖,万事低调可保一路平安)   */

Alter     PROC     [dbo].[AutoGeneration_IUD_P]
@TABLENAME   VARCHAR(50),
@FLAT     TINYINT
AS
BEGIN
set   @TABLENAME=ltrim(rtrim(@TABLENAME))
  DECLARE   @HOST_NAME   VARCHAR(200)
  DECLARE   @GET_DATE   DATETIME
  SELECT   @HOST_NAME=HOST_NAME(),@GET_DATE=GETDATE()
  IF   @FLAT=1   --插入
  BEGIN
  DECLARE   @INSERT_SQLROC   NVARCHAR(4000)
  DECLARE   @INSERT_SQL   VARCHAR(8000)
  DECLARE   @INSERT_PARAMETER   VARCHAR(8000)
  DECLARE   @INSERT_DESCRIPTION   VARCHAR(8000)
  DECLARE   @INSERT_REMARK   VARCHAR(2000)
  DECLARE   @INSERT_COLUMN   VARCHAR(8000)
  SELECT   @INSERT_SQLROC= ' ',@INSERT_SQL= ' ',@INSERT_PARAMETER= ' ',@INSERT_DESCRIPTION= ' ',
    @INSERT_REMARK= ' ',@INSERT_COLUMN= ' '
  SET   @INSERT_SQLROC=@INSERT_SQLROC+ 'IF   EXISTS   (SELECT   1   FROM   SYSOBJECTS   WHERE   ID=OBJECT_ID( ' 'SP_ '+@TABLENAME+ '_AddNew ' ')   AND   XTYPE   IN   (N ' 'P ' ')) '+CHAR(10)
  SET   @INSERT_SQLROC=@INSERT_SQLROC+SPACE(5)+ 'DROP   PROC   SP_ '+@TABLENAME+ '_AddNew '+CHAR(10)
  SET   @INSERT_SQLROC=@INSERT_SQLROC+ 'GO   '
  SELECT   @INSERT_PARAMETER=@INSERT_PARAMETER+SPACE(4)+ '@ '+LTRIM(NAME)+SPACE(2)+
  CASE   WHEN   xtype=34   THEN   'image '
  WHEN   xtype=35   THEN   'text '
  WHEN   xtype=36   THEN   'uniqueidentifier '
  WHEN   xtype=48   THEN   'tinyint '
  WHEN   xtype=52   THEN   'smallint '
  WHEN   xtype=56   THEN   'int '
  WHEN   xtype=58   THEN   'smalldatetime '
WHEN   xtype=59   THEN   'real '
    WHEN   xtype=60   THEN   'money '
      WHEN   xtype=61   THEN   'datetime '
    WHEN   xtype=62   THEN   'float '
    WHEN   xtype=98   THEN   'sql_variant '
    WHEN   xtype=99   THEN   'ntext '
  WHEN   xtype=104   THEN   'bit '
    WHEN   xtype=106   THEN   'decimal '


    WHEN   xtype=108   THEN   'numeric '
  WHEN   xtype=122   THEN   'smallmoney '
    WHEN   xtype=127   THEN   'bigint '
    WHEN   xtype=165   THEN   'varbinary '
WHEN   xtype=167   THEN   'varchar '+ '( '+LTRIM(length)+ ') '
WHEN   xtype=173   THEN   'binary '
WHEN   xtype=175   THEN   'char '+ '( '+LTRIM(length)+ ') '
    WHEN   xtype=189   THEN   'timestamp '
  WHEN   xtype=231   THEN   'nvarchar '+ '( '+LTRIM(length)+ ') '
    WHEN   xtype=239   THEN   'nchar '+ '( '+LTRIM(length)+ ') '
      WHEN   xtype=241   THEN   'xml '
  WHEN   xtype=251   THEN   'sysname '   END+ ', '+CHAR(10),
    @INSERT_REMARK=@INSERT_REMARK+ ',@ '+NAME,
@INSERT_COLUMN=@INSERT_COLUMN+ ', '+NAME
FROM
  (  
    SELECT   NAME,CDEFAULT,A.ID,XTYPE,LENGTH,COLORDER
    FROM   SYSCOLUMNS   A  
    WHERE   A.ID=OBJECT_ID( ' '+@TABLENAME+ ' ')
    AND   COLUMNPROPERTY(A.ID,A.NAME, 'IsIdentity ') <> 1  
    )TB
  ORDER   BY   COLORDER
  SELECT   @INSERT_SQLROC=@INSERT_SQLROC+CHAR(10)+@INSERT_DESCRIPTION+ 'CREATE   PROC     USP_ '+@TABLENAME+ '_AddNew '
  SET   @INSERT_SQLROC=@INSERT_SQLROC+CHAR(13)+CHAR(10)+LEFT(@INSERT_PARAMETER,LEN(@INSERT_PARAMETER)-2)+CHAR(10)
  SET   @INSERT_SQLROC=@INSERT_SQLROC+ 'AS '+CHAR(10)+ 'BEGIN '
  SET   @INSERT_SQLROC=@INSERT_SQLROC+CHAR(10)+SPACE(4)+ 'SET   NOCOUNT   ON '
  SET   @INSERT_SQL=SPACE(8)+ 'INSERT   INTO   '+@TABLENAME+ '( '+STUFF(@INSERT_COLUMN,1,1, ' ')+ ') '+CHAR(13)+CHAR(10)+SPACE(8)+ '   SELECT   '+STUFF(@INSERT_REMARK,1,1, ' ')
SET   @INSERT_SQLROC=@INSERT_SQLROC+CHAR(10)+CHAR(32)+@INSERT_SQL
  SET   @INSERT_SQLROC=@INSERT_SQLROC+CHAR(10)+SPACE(8)+ '   SELECT   _ROWCOUNT=@@ROWCOUNT '
  SET   @INSERT_SQLROC=@INSERT_SQLROC+CHAR(10)+SPACE(4)+ 'SET   NOCOUNT   OFF '  
  SET   @INSERT_SQLROC=@INSERT_SQLROC+CHAR(10)+ 'END '
  PRINT   @INSERT_SQLROC+CHAR(10)+ 'GO   '
  END


[解决办法]
简单的说就是执行一个存储过程SP_TOOL,假如这个存储过程带个参数名为@name,就执行一个查找操作。看名为@name的表存在不存在。如果存在就在建立一个存储过程对表@name进行插入操作。表@name的字段,类型都靠自己写SQL语句找出来
-------------------------------------------

表名做参数,传入后,先到系统表中判断,这需要用到动态SQL语句,因为表名是变量。

如果存在这个表,也需要用动态SQL把数据追加到这个表中。
[解决办法]

先把这里的ALTER 该为CREATE 选中执行,
Alter PROC [dbo].[AutoGeneration_IUD_P]
@TABLENAME VARCHAR(50),
@FLAT TINYINT
AS
此时返回消息为:命令已成功完成。

然后将其CREATE 该为原来的ALTER ,执行这个程序就成功了
但其这个程序的意义还没有仔细研究,有空探讨
[解决办法]
其实道理很简单。写一个插入表的存储过程LZ应该会吧,AutoGeneration_IUD_P的作用就是生成了创建或修改插入表的存储过程的脚本。研究以下SysColumns和创建存储过程脚本在规律,理解AutoGeneration_IUD_P就不难了。

热点排行