解讀為SQL Server數(shù)據(jù)庫傳數(shù)組參數(shù)的變通辦法_Mssql數(shù)據(jù)庫教程
推薦:詳解MSSQL的安全設(shè)置問題目前SQL INJECTION的攻擊測試愈演愈烈,很多大型的網(wǎng)站和論壇都相繼被注入。這些網(wǎng)站一般使用的多為SQL SERVER數(shù)據(jù)庫,正因為如此,很多人開始懷疑SQL SERVER的安全性。其實SQL SERVER 2000已經(jīng)通過了美國政府的C2級安全認證-這是該行業(yè)所能擁有的最高認證級
最近一直在做Dnn模塊的開發(fā),過程中碰到這么一個問題,需要同時插入N條數(shù)據(jù),不想在程序里控制,但是SQL Sever又不支持數(shù)組參數(shù).所以只能用變通的辦法了.利用SQL Server強大的字符串處理傳把數(shù)組格式化為類似"1,2,3,4,5,6"。
然后在存儲過程中用SubString配合CharIndex把分割開來
詳細的存儲過程
CREATE PROCEDURE dbo.ProductListUpdateSpecialList
@ProductId_Array varChar(800),
@ModuleId int
AS
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @TId int
Set @PointerPrev=1
set @PointerCurr=1
begin transaction
Set NoCount ON
delete from ProductListSpecial where ModuleId=@ModuleId
Set @PointerCurr=CharIndex(',',@ProductId_Array,@PointerPrev+1)
set @TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev,@PointerCurr-@PointerPrev) as int)
Insert into ProductListSpecial (ModuleId,ProductId) Values(@ModuleId,@TId)
SET @PointerPrev = @PointerCurr
while (@PointerPrev+1 < LEN(@ProductId_Array))
Begin
Set @PointerCurr=CharIndex(',',@ProductId_Array,@PointerPrev+1)
if(@PointerCurr>0)
Begin
set @TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev+1,@PointerCurr-@PointerPrev-1) as int)
Insert into ProductListSpecial (ModuleId,ProductId) Values(@ModuleId,@TId)
SET @PointerPrev = @PointerCurr
End
else
Break
End
set @TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev+1,LEN(@ProductId_Array)-@PointerPrev) as int)
Insert into ProductListSpecial (ModuleId,ProductId) Values(@ModuleId,@TId)
Set NoCount OFF
if @@error=0
begin
commit transaction
end
else
begin
rollback transaction
end
GO
網(wǎng)友Bizlogic對此的改進方法:
應(yīng)該用SQL2000 OpenXML更簡單,效率更高,代碼更可讀:
CREATE Procedure [dbo].[ProductListUpdateSpecialList]
(
@ProductId_Array NVARCHAR(2000),
@ModuleId INT
)
AS
delete from ProductListSpecial where ModuleId=@ModuleId
-- If empty, return
IF (@ProductId_Array IS NULL OR LEN(LTRIM(RTRIM(@ProductId_Array))) = 0)
RETURN
DECLARE @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @ProductId_Array
Insert into ProductListSpecial (ModuleId,ProductId)
Select
@ModuleId,C.[ProductId]
FROM
OPENXML(@idoc, '/Products/Product', 3)
with (ProductId int ) as C
where
C.[ProductId] is not null
EXEC sp_xml_removedocument @idoc
分享:解讀改善SQL Server內(nèi)存管理的問題最近,為了能在數(shù)據(jù)庫服務(wù)器中運行其他應(yīng)用程序,在保持數(shù)據(jù)庫操作系統(tǒng)版本不變的前提下對數(shù)據(jù)庫服務(wù)器進行了軟、硬件上的升級。在軟件上,將操作系統(tǒng)從Windows 2000升級到Windows Server 2003;在硬件上,將服務(wù)器中的內(nèi)存由原來的512MB增加到1GB(1024MB)。
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法
- sql刪除重復(fù)數(shù)據(jù)的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- 解析SQL Server和Oracle常用函數(shù)區(qū)別
- 如何巧妙規(guī)劃使用Oracle數(shù)據(jù)空間
- sql2k中新增加的Function的sqlbook 的幫助
- 談SQL Server 數(shù)據(jù)挖掘應(yīng)用于商業(yè)智能中
- 詳解Microsoft SQL Server數(shù)據(jù)庫開發(fā)問題
- 解析SQL Server數(shù)據(jù)庫恢復(fù)操作實例
- Mssql數(shù)據(jù)庫教程之--SQL Server 2008:傳遞表值參數(shù)
- 修改SQL Server2005的sa用戶密碼
- SQL Server 2008存儲結(jié)構(gòu)之GAM、SGAM介紹
- 詳解SQL Server數(shù)據(jù)庫的集群設(shè)計
猜你也喜歡看這些
- MYSQL 事件高度器
- 解析MYSQL 數(shù)據(jù)庫導(dǎo)入SQL 文件出現(xiàn)亂碼的問題
- 如何用workbench導(dǎo)出mysql數(shù)據(jù)庫關(guān)系圖
- 如何用cmd連接Mysql數(shù)據(jù)庫
- 網(wǎng)站模板:以數(shù)據(jù)庫字段分組顯示數(shù)據(jù)的sql語句
- 用MyEclipse配置DataBase Explorer(圖示)
- MySQL和Access的區(qū)別
- MSSQL清空日志刪除日志文件
- 如何通過配置自動實現(xiàn)ValueList中hql語句的整型參數(shù)轉(zhuǎn)換
- MySQL——修改root密碼的4種方法(以windows為例)
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-解讀為SQL Server數(shù)據(jù)庫傳數(shù)組參數(shù)的變通辦法。