|
導(dǎo)讀數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)... 數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合。 通過使用這個(gè)存儲過程,你就可以方便的對數(shù)據(jù)庫中具有一定規(guī)則的或者全部表,對這里的字段進(jìn)行各種操作,具體看示例! CREATE PROCEDURE SP_execSQLonDB (@TABLENAME VARCHAR(50), --表名條件 @COLUMNNAME VARCHAR(50), --字段條件 @SQL NVARCHAR(4000), --執(zhí)行的SQL @INCLUDE_NTI CHAR(1) = ’N’) --是否包含Text,NText,Image數(shù)據(jù)類型 AS BEGIN --Variable Declaration --變量定義 DECLARE @strSQL NVARCHAR(4000) DECLARE @SQL2 NVARCHAR(4000) DECLARE @sTableName VARCHAR(200) DECLARE @sColumnName VARCHAR(200) DECLARE @SQLTemp NVARCHAR(4000) --Check whether to include TEXT, NTEXT, IMAGE data types --檢查是否需要包含 Text,NText,Image數(shù)據(jù)類型 SET @INCLUDE_NTI = UPPER(LTRIM(RTRIM(@INCLUDE_NTI))) IF @INCLUDE_NTI NOT IN (’N’, ’Y’) SET @INCLUDE_NTI = ’N’ --Construct a cursor to get the list of Table/Column Names according to the @TABLENAME and @COLUMNNAME parameters. --創(chuàng)建一個(gè)游標(biāo)來讀取表名和列名的列表,這里列表由參數(shù)@TABLENAME 和 @COLUMNNAME 決定 SET @strSQL = N’DECLARE TabColCursor CURSOR FOR SELECT RTRIM(LTRIM(SU.name)) + ’’.’’ + LTRIM(RTRIM(SO.name)), SC.name FROM sysobjects SO INNER JOIN syscolumns SC ON SO.id = SC.id INNER JOIN sysusers SU ON SO.uid = SU.uid WHERE SO.xtype = ’’U’’ ’ --Filter out Text/NText/Image data types if it is not included --假如不包含Text/NText/Image數(shù)據(jù)類型,把他們過濾掉 IF @INCLUDE_NTI = ’N’ --In SysColumns sytem table XTYPE column corresponds to Column Data Type SET @strSQL = @strSQL + ’ AND SC.xtype NOT IN (35, 99, 34) ’ --Add the TABLE(S) name i.e. filter if it is supplied --假如有提供表名參數(shù),把它寫入過濾條件中 IF @TABLENAME IS NOT NULL AND ltrim(rtrim(@TABLENAME)) <> ’’ BEGIN SET @TABLENAME = REPLACE(@TABLENAME, ’, ’, ’,’) SET @strSQL = @strSQL + ’ AND (SO.name LIKE ’’’ + REPLACE(@TABLENAME, ’,’, ’’’ OR SO.name LIKE ’’’) + ’’’)’ SET @SQLTemp= ’ AND (SO.name LIKE ’’’ + REPLACE(@TABLENAME, ’,’, ’’’ OR SO.name LIKE ’’’) + ’’’)’ END --Add the COLUMN(S) name i.e. filter if it is supplied --假如有提供列名參數(shù),把它寫入過濾條件中 IF @COLUMNNAME IS NOT NULL AND ltrim(rtrim(@COLUMNNAME)) <> ’’ BEGIN SET @COLUMNNAME = REPLACE(@COLUMNNAME, ’, ’, ’,’) SET @strSQL = @strSQL + ’ AND (SC.name LIKE ’’’ + REPLACE(@COLUMNNAME, ’,’, ’’’ OR SC.name LIKE ’’’) + ’’’)’ END --Execute the constructed "Cursor Declaration" string --執(zhí)行定義游標(biāo)的SQL語句 EXECUTE sp_executesql @strSQL IF @@ERROR > 0 BEGIN PRINT ’Error while declaring the Cursor. Please check out the parameters supplied to the Procedure’ RETURN -1 END --Database Transaction. --標(biāo)記一個(gè)顯式本地事務(wù)的起始點(diǎn) BEGIN TRANSACTION gDatabaseTrans --Open the cursor --打開游標(biāo) OPEN TabColCursor --Fetch te Table, Column names to variables --用游標(biāo)取出標(biāo)名、列名對應(yīng)到參數(shù) FETCH NEXT FROM TabColCursor INTO @sTableName, @sColumnName [page_break]--Execute the SQL statement supplied in @SQL parameter on every row of Cursor’s data --對于每一行游標(biāo)取出的數(shù)據(jù),執(zhí)行由@SQL參數(shù)傳進(jìn)來的SQL語句 WHILE @@FETCH_STATUS = 0 BEGIN --Construct SQL2 to Execute supplied @SQL --by replacing @TABLENAME, @COLUMNNAME with running Table Name, Column Name of Cursor’s data --用游標(biāo)取出的表名列名來替換@SQL中的@TABLENAME, @COLUMNNAME來構(gòu)造SQL2 SET @SQL2 = @SQL SET @SQL2 = REPLACE(@SQL2, ’@TABLENAME’, @sTableName) SET @SQL2 = REPLACE(@SQL2, ’@COLUMNNAME’, @sColumnName) --Execute the constructed SQL2 --執(zhí)行SQL2 EXECUTE sp_executesql @SQL2 --Check for errors --檢查錯(cuò)誤 IF @@ERROR <> 0 BEGIN --On Error, Destroy objects, Rollback transaction --Return -1 as UNSUCCESSFUL flag --如果發(fā)生錯(cuò)誤,刪除游標(biāo),回滾 --返回錯(cuò)誤標(biāo)記 -1 PRINT ’Error occurred’ DEALLOCATE TabColCursor ROLLBACK TRANSACTION gDatabaseTrans RETURN -1 END --Process Next Row of Cursor --進(jìn)行下一行數(shù)據(jù) FETCH NEXT FROM TabColCursor INTO @sTableName,@sColumnName END --Destroy CURSOR object --刪除游標(biāo) DEALLOCATE TabColCursor --Procedure executed properly. Commit the Transaction. --Return 0 as SUCCESSFUL flag --成功完成存儲過程,成功結(jié)束事務(wù) --返回成功標(biāo)記 0 COMMIT TRANSACTION gDatabaseTrans RETURN 0 END 使用例子 1、這個(gè)例子在NORTHWIND數(shù)據(jù)庫上執(zhí)行 把所有表中列名包含Name的列中,把以“Ltd.”結(jié)尾的列替換成“LIMITED”。 用 SELECT * FROM Suppliers檢查運(yùn)行結(jié)果! EXEC SP_execSQLonDB ’’, --沒有表名條件,針對所有表 ’%Name%’, --列名條件,列名包含“Name”字符串 ’UPDATE @TABLENAME SET @COLUMNNAME = REPLACE(@COLUMNNAME,’’Ltd.’’,’’LIMITED’’) WHERE @COLUMNNAME LIKE ’’%Ltd.’’’, --UPDATE 語句 ’N’ --不包含NTEXT,TEXT,IMAGE數(shù)據(jù)類型 2、這個(gè)例子也在NORTHWIND數(shù)據(jù)庫上執(zhí)行 統(tǒng)計(jì)所有表中列名包含Name的列的值是“QUICK-Stop”的數(shù)量 create table ##TMP1 (table_name varchar(200),column_name varchar(200),rou_count int) exec SP_execSQLonDB ’’, ’%Name%’, ’DECLARE @iCount as int SELECT @iCount=COUNT(1) FROM @TABLENAME WHERE @COLUMNNAME = ’’QUICK-Stop’’ IF @iCount >0 INSERT INTO ##TMP1 SELECT ’’@TABLENAME’’,’’@COLUMNNAME’’,@iCount’, ’N’ select * from ##TMP1 3、這個(gè)例子自己理解 針對所有以“EMPLOYEE”開頭的表,以“DEPT”開頭的字段執(zhí)行存儲過程。 EXEC SP_execSQLonDB ’EMPLOYEE%’, ’DEPT%’, ’EXEC USP_DeptStates ’’@TABLENAME’’,’’@COLUMNNAME’’’, ’N’ 4、還是自己理解 對@TABLENAME @COLUMNNAME參數(shù)給于多個(gè)值! EXEC SP_execSQLonDB ’EMPLOYEE%,PF%’, ’SALARY,%AMOUNT%’, ’EXEC USP_EMPLOYEE_PF ’, ’N’ 全新的路由器不僅讓你更穩(wěn)定快速地連接無線網(wǎng)絡(luò),更可以讓家中的智能設(shè)備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!