给SQL Server传送数组参数的变通办法

作者:佚名 来源:qqcf.com 时间:2008-11-25 11:39:00 

最近一直在做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

标签:
0
投稿

猜你喜欢

  • 解决Keyerror ''acc'' KeyError: ''val_acc''问题

    2022-09-05 11:28:12
  • 解决MySQL 5.7中定位DDL被阻塞的问题

    2024-01-14 10:20:01
  • vue3的介绍和两种创建方式详解(cli和vite)

    2023-07-02 16:51:31
  • 开心网让人很不开心

    2009-04-05 15:56:00
  • 使用Python脚本对Linux服务器进行监控的教程

    2022-06-19 18:27:26
  • python中的lambda函数用法指南

    2021-04-15 02:58:15
  • Python3+Pycharm+PyQt5环境搭建步骤图文详解

    2023-12-17 06:55:01
  • python+PyQT实现系统桌面时钟

    2023-07-21 07:46:33
  • 如何在 Vue 表单中处理图片

    2024-05-02 16:10:08
  • Mysql字符串截取及获取指定字符串中的数据

    2024-01-24 21:07:46
  • sql 取两值之间的数据方法(例:100-200之间的数据)

    2024-01-24 03:55:20
  • SQL查询语句优化的实用方法总结

    2024-01-25 18:51:21
  • 在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗

    2011-06-06 10:28:00
  • 解决运行出现'dict' object has no attribute 'has_key'问题

    2021-06-14 06:58:48
  • 解析CSS列表样式属性list-style

    2009-03-26 13:16:00
  • python运用sklearn实现KNN分类算法

    2022-12-04 03:53:19
  • 使用python测试prometheus的实现

    2023-08-31 15:24:05
  • 基于js里调用函数时,函数名带括号和不带括号的区别

    2023-08-24 05:05:41
  • [设计]DREAMWEAVER 问题集锦

    2010-09-02 12:31:00
  • python numpy数组中的复制知识解析

    2023-08-10 14:41:33
  • asp之家 网络编程 m.aspxhome.com