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就不难了。