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

请教update和insert通用存储过程应该如何写

2012-02-12 
请问update和insert通用存储过程应该怎么写?select和delete的通用存储过程比较好写。但是更新update和添加i

请问update和insert通用存储过程应该怎么写?
select和delete的通用存储过程比较好写。
但是更新update和添加insert两个存储过程有点问题,请各位帮忙!
-----------------------
CREATE         PROCEDURE   sp_update
@tblName   varchar(255),   --   表名  
@strUpdate   varchar(1000),   --   更新内容  
@strWhere   varchar(1000)   =   ' '   --   查询条件   (不要加   where)  
AS  
BEGIN
declare   @strSQL   varchar(2000)   --   主语句  
if   @strWhere   !=   ' '  
set   @strSQL   =   'update   [ '   +   @tblName   +   ']   set   '   +   @strUpdate   +   'where   ( '   +   @strWhere   +   ')   '  
else  
set   @strSQL   =   'update   [ '   +   @tblName   +   ']   set   '   +   @strUpdateexecute   (@strSQL)  
END
---------------------------
@strUpdate的内容就是如:   [字段1]=值1,[字段2]=值2,[字段n]=值n  
现在的问题:如果要更新的某个字段类型是ntext,其对应的值为2万字的一篇文章,那么我这里@strSQL类型因为不能为ntext,varchar类型又最多8000,所以最后执行的execute   (@strSQL)   肯定就会出错,请问应该怎么办呢?
另外,如果某个字段的值正好为:“   [xxx]=xxx,   ”这种情况,那么@strUpdate的内容就可能是:[字段1]=[xxx]=xxx,,[字段2]=值2,[字段n]=值n   这种情况,请问如何处理这个问题呢?

[解决办法]
支持楼主,先顶一下
[解决办法]
单独更新ntext啊,其它字段一起更新
[解决办法]
要是sqlserver2005就可以用varchar(max)
[解决办法]
-- 类似下面这样可以解决长度问题

CREATE PROCEDURE sp_update
@tblName varchar(255), -- 表名
@strUpdate varchar(1000), -- 更新内容
@strWhere varchar(1000) = ' ' -- 查询条件 (不要加 where)
AS
BEGIN
declare @strSQL nvarchar(4000) -- 主语句
if @strWhere != ' '
set @strSQL = 'update [ ' + @tblName + '] set @strUpdate where ( ' + @strWhere + ') '
else
set @strSQL = 'update [ ' + @tblName + '] set @strUpdate '
execute sp_executesql @strSQL, N '@strUpdate varchar(1000) ', @strUpdate
END

[解决办法]
但上述方法无法数据类型的问题.
如果单独处理text列, 则是可以做到的

-- 类似下面这样可以解决长度问题

CREATE PROCEDURE sp_update
@tblName varchar(255), -- 表名
@strUpdate text, -- 更新内容
@strWhere varchar(1000) = ' ' -- 查询条件 (不要加 where)
AS
BEGIN
declare @strSQL nvarchar(4000) -- 主语句
if @strWhere != ' '
set @strSQL = 'update [ ' + @tblName + '] set @strUpdate where ( ' + @strWhere + ') '
else
set @strSQL = 'update [ ' + @tblName + '] set @strUpdate '
execute sp_executesql @strSQL, N '@strUpdate text ', @strUpdate
END


[解决办法]
CREATE PROCEDURE PRO_INSERT
@tblName Nvarchar(100), -- 表名
@strUpdate Nvarchar(4000), -- 更新内容
@strWhere varchar(1000) = ' ' -- 查询条件 (不要加 where)
AS

DECLARE @EXEC nvarchar(4000) --最终执行语句
DECLARE @parm nvarchar(4000) --参数变量
DECLARE @col nvarchar(4000) --列字段变量
DECLARE @value nvarchar(4000) --值字段变量
SET @parm= ' '
SET @col= ' '
SET @value= ' '
----设置参数变量


SELECT @parm=@parm+N '@ '+CAST(name as Nvarchar(20))+ ' '+cast(TYPE_NAME(xtype) as Nvarchar(20))+
CASE
WHEN
xtype in(35,36,48,52,56,58,59,98,99,122,189)
THEN
', '
WHEN
xtype in(106,108)
THEN
'( '+cast(length as varchar)+ ', '+cast(xscale as varchar)+ '), '
ELSE
'( '+cast(length as varchar)+ '), '
END
FROM
syscolumns WHERE object_name(id)=@tblName
----设置字段变量
SELECT @col=@col+CAST(name as Nvarchar(20))+N ', ' FROM syscolumns WHERE object_name(id)=@tblName
----设置值变量
SELECT @value =@value+N '@ '+CAST(name as Nvarchar(20))+N ', ' FROM syscolumns WHERE object_name(id)=@tblName

SET @parm=LEFT(@parm,LEN(@parm)-1)
SET @col=LEFT(@col,LEN(@col)-1)
SET @value=LEFT(@value,LEN(@value)-1)
--设置最终执行语句
SET @EXEC= 'INSERT INTO '+@tblName+ '( '+@col+ ') VALUES ( '+@value+ ') '
EXEC( 'DECLARE '+@parm+ ' EXECUTE sp_executesql N ' ' '+@EXEC+ ' ' ',N ' ' '+@parm+ ' ' ' '+ ', '+@strUpdate)
GO
CREATE TABLE TESTTB
(
ID INT,
COL1 VARCHAR(50)
)
DECLARE@return_value int

EXEC@return_value = [dbo].[PRO_INSERT]
@tblName = N 'TESTTB ',
@strUpdate = N '1, ' 'HELLO ' ' '

SELECT 'Return Value ' = @return_value
SELECT * FROM TESTTB
DROP TABLE TESTTB
--结果
ID COL1
----------- --------------------------------------------------
1 HELLO

(1 行受影响)
--此过程对长语句不支持,输入值用,分隔,对于varchar类型之类的值加 '输入
[解决办法]
晕啊,刚才试了一下,发现datetime类型的给加长度了。现在改成
ALTER PROCEDURE [dbo].[PRO_INSERT]
@tblName Nvarchar(100), -- 表名
@strUpdate Ntext -- 更新内容
AS

DECLARE @EXEC nvarchar(4000) --最终执行语句
DECLARE @parm nvarchar(4000) --参数变量
DECLARE @col nvarchar(4000) --列字段变量
DECLARE @value nvarchar(4000) --值字段变量
SET @parm= ' '
SET @col= ' '
SET @value= ' '
----设置参数变量
SELECT @parm=@parm+N '@ '+CAST(name as Nvarchar(20))+ ' '+cast(TYPE_NAME(xtype) as Nvarchar(20))+
CASE
WHEN
xtype in(35,36,48,52,56,58,59,61,98,99,122,189)
THEN
', '
WHEN
xtype in(106,108)
THEN
'( '+cast(length as varchar)+ ', '+cast(xscale as varchar)+ '), '
ELSE
'( '+cast(length as varchar)+ '), '
END
FROM
syscolumns WHERE object_name(id)=@tblName
----设置字段变量
SELECT @col=@col+CAST(name as Nvarchar(20))+N ', ' FROM syscolumns WHERE object_name(id)=@tblName
----设置值变量
SELECT @value =@value+N '@ '+CAST(name as Nvarchar(20))+N ', ' FROM syscolumns WHERE object_name(id)=@tblName

SET @parm=LEFT(@parm,LEN(@parm)-1)
SET @col=LEFT(@col,LEN(@col)-1)
SET @value=LEFT(@value,LEN(@value)-1)
print @parm
--设置最终执行语句
SET @EXEC= 'INSERT INTO '+@tblName+ '( '+@col+ ') VALUES ( '+@value+ ') '
EXEC( 'DECLARE '+@parm+ ' EXECUTE sp_executesql N ' ' '+@EXEC+ ' ' ',N ' ' '+@parm+ ' ' ' '+ ', '+@strUpdate)
执行
--
DECLARE@return_value int

EXEC@return_value = [dbo].[PRO_INSERT]
@tblName = N 'dq_infor2 ',
@strUpdate = N '2, ' '字符串二 ' ', ' '字符串三 ' ', ' '2007-03-31 00:00:00.000 ' ' '

SELECT 'Return Value ' = @return_value


SELECT * FROM dq_infor2 where rtrim(id)= '2 '
--结果
id unit address regdate
--------------- ---------- ---------- -----------------------
2 字符串二 字符串三 2007-03-31 00:00:00.000

(1 行受影响)
--另外,这个存储过程还不支持带自增列的。
再试一下吧,有时间再完善一下。

热点排行