请问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 行受影响)
--另外,这个存储过程还不支持带自增列的。
再试一下吧,有时间再完善一下。