為SQL Server資料庫傳陣列引數的變通辦法
最近一直在做Dnn模組的開發,過程中碰到這麼一個問題,需要同時插入N條資料,不想在程式裡控制,但是SQL
Sever又不支援陣列引數.所以只能用變通的辦法了.利用SQL Server強大的字串處理傳把陣列格式化為類似"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
網友Bizlogic對此的改進方法:
應該用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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-617306/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 給SQL Server傳送陣列引數的變通辦法(轉)SQLServer陣列
- 給SQL Server儲存過程,傳送陣列引數的變通辦法SQLServer儲存過程陣列
- SQL SERVER 資料庫被標記為“可疑”的解決辦法SQLServer資料庫
- sql server資料庫如何儲存陣列,int[]float[]double[]陣列儲存到資料庫方法SQLServer資料庫陣列
- kettle通過命令列引數傳遞資料庫連線資訊命令列資料庫
- MyBatis中foreach傳入引數為list、陣列、map的不同寫法MyBatis陣列
- Java 陣列的不同定義方式和陣列長度為可變引數Java陣列
- SQL Server資料庫基礎之行資料轉換為列資料SQLServer資料庫
- MyBatis傳入多個引數,傳入陣列和列表資料的處理MyBatis陣列
- SQL Server中獲取一個資料庫的所有表的列數SQLServer資料庫
- 資料庫資料恢復-SQL SERVER資料庫檔案大小變為“0”的資料恢復方案資料庫資料恢復SQLServer
- SQL Server 資料庫損壞、檢測以及簡單的修復辦法SQLServer資料庫
- Java方法04:命令列傳遞引數、可變引數Java命令列
- c++ -- 二維陣列引數傳遞C++陣列
- Shell自學二(引數傳遞和陣列)陣列
- SQL Server無法刪除資料庫 "xxx",因為該資料庫當前正在使用(如何刪除一個Sql Server資料庫)SQLServer資料庫
- 引數為*&與*的區別以及二維陣列傳遞時列數不對等的區別陣列
- DataGear 變更部署資料庫為SQL Server填坑指南(含轉寫後的SQL server程式碼及SQL server配置檔案)資料庫SQLServer
- 通過SQL Server資料庫映象保護虛擬資料庫ICSQLServer資料庫
- 資料庫變慢了的分析及解決辦法資料庫
- SQL server資料庫高可用日誌傳送的方法SQLServer資料庫
- SQL Server 資料庫無法重新命名的解決SQLServer資料庫
- 判斷資料庫中表內資料為空的辦法資料庫
- 使用SQL來分析資料庫引數(二)SQL資料庫
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- c# 方法引數_陣列引數C#陣列
- 複製或傳送SQL Server資料庫(ADP)SQLServer資料庫
- 【勝通 】mysql的引數變數MySql變數
- Developer 帶有名為 SQL Server Compact 免費的 SQL 資料庫DeveloperSQLServer資料庫
- 請求引數為物件,mybatis的sql寫法物件MyBatisSQL
- sql server 資料庫中null 轉換為 0SQLServer資料庫Null
- ts中如何限制方法傳入的引數data必須是陣列,且為偶數項?陣列
- SQL Server資料庫檢視一個資料表各列的註釋SQLServer資料庫
- SQL Server資料庫安全SQLServer資料庫
- SQL Server 資料庫映象SQLServer資料庫
- SQL Server 資料庫索引SQLServer資料庫索引
- 資料庫映象 (SQL Server)資料庫SQLServer
- jdbctemplate呼叫儲存過程傳遞陣列引數JDBC儲存過程陣列