仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 916|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网页编程之怎样同时对多个表或列操纵

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:32:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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存放这些历史数据。
金色的骷髅 该用户已被删除
沙发
发表于 2015-1-19 16:17:38 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
分手快乐 该用户已被删除
板凳
发表于 2015-1-26 12:50:30 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
若相依 该用户已被删除
地板
发表于 2015-2-4 15:17:39 | 只看该作者
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。
简单生活 该用户已被删除
5#
发表于 2015-2-10 02:50:00 | 只看该作者
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
精灵巫婆 该用户已被删除
6#
发表于 2015-3-10 03:44:03 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
因胸联盟 该用户已被删除
7#
发表于 2015-3-17 04:12:12 | 只看该作者
分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。
乐观 该用户已被删除
8#
发表于 2015-3-23 19:48:13 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 00:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表