|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢?
怎样同时对多个表或列操纵
经由过程利用这个存储历程,你就能够便利的对数据库中具有必定划定规矩的大概全体表,对这里的字段举行各类操纵,详细看示例!
CREATEPROCEDURESP_execSQLonDB
(@TABLENAMEVARCHAR(50),--表名前提
@COLUMNNAMEVARCHAR(50),--字段前提
@SQLNVARCHAR(4000),--实行的SQL
@INCLUDE_NTICHAR(1)=N)--是不是包括Text,NText,Image数据范例
AS
BEGIN
--VariableDeclaration
--变量界说
DECLARE@strSQLNVARCHAR(4000)
DECLARE@SQL2NVARCHAR(4000)
DECLARE@sTableNameVARCHAR(200)
DECLARE@sColumnNameVARCHAR(200)
DECLARE@SQLTempNVARCHAR(4000)
--CheckwhethertoincludeTEXT,NTEXT,IMAGEdatatypes
--反省是不是必要包括Text,NText,Image数据范例
SET@INCLUDE_NTI=UPPER(LTRIM(RTRIM(@INCLUDE_NTI)))
IF@INCLUDE_NTINOTIN(N,Y)
SET@INCLUDE_NTI=N
--ConstructacursortogetthelistofTable/ColumnNamesaccordingtothe@TABLENAMEand@COLUMNNAMEparameters.
--创立一个游标来读取表名和列名的列表,这里列表由参数@TABLENAME和@COLUMNNAME决意
SET@strSQL=NDECLARETabColCursorCURSORFORSELECTRTRIM(LTRIM(SU.name))+.+LTRIM(RTRIM(SO.name)),SC.nameFROMsysobjectsSOINNERJOINsyscolumnsSCONSO.id=SC.idINNERJOINsysusersSUONSO.uid=SU.uidWHERESO.xtype=U
--FilteroutText/NText/Imagedatatypesifitisnotincluded
--假设不包括Text/NText/Image数据范例,把他们过滤失落
IF@INCLUDE_NTI=N
--InSysColumnssytemtableXTYPEcolumncorrespondstoColumnDataType
SET@strSQL=@strSQL+ANDSC.xtypeNOTIN(35,99,34)
--AddtheTABLE(S)namei.e.filterifitissupplied
--假设有供应表名参数,把它写进过滤前提中
IF@TABLENAMEISNOTNULLANDltrim(rtrim(@TABLENAME))
BEGIN
SET@TABLENAME=REPLACE(@TABLENAME,,,,)
SET@strSQL=@strSQL+AND(SO.nameLIKE+REPLACE(@TABLENAME,,,ORSO.nameLIKE)+)
SET@SQLTemp=AND(SO.nameLIKE+REPLACE(@TABLENAME,,,ORSO.nameLIKE)+)
END
--AddtheCOLUMN(S)namei.e.filterifitissupplied
--假设有供应列名参数,把它写进过滤前提中
IF@COLUMNNAMEISNOTNULLANDltrim(rtrim(@COLUMNNAME))
BEGIN
SET@COLUMNNAME=REPLACE(@COLUMNNAME,,,,)
SET@strSQL=@strSQL+AND(SC.nameLIKE+REPLACE(@COLUMNNAME,,,ORSC.nameLIKE)+)
END
--Executetheconstructed"CursorDeclaration"string
--实行界说游标的SQL语句
EXECUTEsp_executesql@strSQL
IF@@ERROR>0
BEGIN
PRINTErrorwhiledeclaringtheCursor.PleasecheckouttheparameterssuppliedtotheProcedure
RETURN-1
END
--DatabaseTransaction.
--标志一个显式当地事件的肇端点
BEGINTRANSACTIONgDatabaseTrans
--Openthecursor
--翻开游标
OPENTabColCursor
--FetchteTable,Columnnamestovariables
--用游标掏出标名、列名对应到参数
FETCHNEXTFROMTabColCursor
INTO@sTableName,@sColumnName
--ExecutetheSQLstatementsuppliedin@SQLparameteroneveryrowofCursorsdata
--关于每行游标掏出的数据,实行由@SQL参数传出去的SQL语句
WHILE@@FETCH_STATUS=0
BEGIN
--ConstructSQL2toExecutesupplied@SQL
--byreplacing@TABLENAME,@COLUMNNAMEwithrunningTableName,ColumnNameofCursorsdata
--用游标掏出的表名列名来交换@SQL中的@TABLENAME,@COLUMNNAME来机关SQL2
SET@SQL2=@SQL
SET@SQL2=REPLACE(@SQL2,@TABLENAME,@sTableName)
SET@SQL2=REPLACE(@SQL2,@COLUMNNAME,@sColumnName)
--ExecutetheconstructedSQL2
--实行SQL2
EXECUTEsp_executesql@SQL2
--Checkforerrors
--反省毛病
IF@@ERROR0
BEGIN
--OnError,Destroyobjects,Rollbacktransaction
--Return-1asUNSUCCESSFULflag
--假如产生毛病,删除游标,回滚
--前往毛病标志-1
PRINTErroroccurred
DEALLOCATETabColCursor
ROLLBACKTRANSACTIONgDatabaseTrans
RETURN-1
END
--ProcessNextRowofCursor
--举行下一行数据
FETCHNEXTFROMTabColCursor
INTO@sTableName,@sColumnName
END
--DestroyCURSORobject
--删除游标
DEALLOCATETabColCursor
--Procedureexecutedproperly.CommittheTransaction.
--Return0asSUCCESSFULflag
--乐成完成存储历程,乐成停止事件
--前往乐成标志0
COMMITTRANSACTIONgDatabaseTrans
RETURN0
END
利用例子
1、这个例子在NORTHWIND数据库上实行
把一切表中列名包括Name的列中,把以“Ltd.”开头的列交换成“LIMITED”。
用SELECT*FROMSuppliers反省运转了局!
EXECSP_execSQLonDB
,--没有表名前提,针对一切表
%Name%,--列名前提,列名包括“Name”字符串
UPDATE@TABLENAMESET@COLUMNNAME=REPLACE(@COLUMNNAME,Ltd.,LIMITED)
WHERE@COLUMNNAMELIKE%Ltd.,--UPDATE语句
N--不包括NTEXT,TEXT,IMAGE数据范例
2、这个例子也在NORTHWIND数据库上实行
统计一切表中列名包括Name的列的值是“QUICK-Stop”的数目
createtable##TMP1(table_namevarchar(200),column_namevarchar(200),rou_countint)
execSP_execSQLonDB
,
%Name%,
DECLARE@iCountasint
SELECT@iCount=COUNT(1)FROM@TABLENAMEWHERE@COLUMNNAME=QUICK-Stop
IF@iCount>0
INSERTINTO##TMP1SELECT@TABLENAME,@COLUMNNAME,@iCount,
N
select*from##TMP1
3、这个例子本人了解
针对一切以“EMPLOYEE”开首的表,以“DEPT”开首的字段实行存储历程。
EXECSP_execSQLonDB
EMPLOYEE%,
DEPT%,
EXECUSP_DeptStates@TABLENAME,@COLUMNNAME,
N
4、仍是本人了解
对@TABLENAME@COLUMNNAME参数给于多个值!
EXECSP_execSQLonDB
EMPLOYEE%,PF%,
SALARY,%AMOUNT%,
EXECUSP_EMPLOYEE_PF,
N
用一个库#bak_database存放这些历史数据。 |
|