Sql Server 中模拟数组
2007-07-30 23:54 晓风残月 阅读(1223) 评论(0) 收藏 举报SQL Server 不支持数组参数,然而作为二维关系的“表”事实上不就是一个“数组”吗?
这里通过自定义函数分隔目标字符串,并作为表变量结果集返回。
自定义函数可以直接用在常见的 DML 语句中,如 SELECT。
对于某些多对多应用中,前端应用程序可以直接将多的那边键连接成字符串,连同一的那边的数据一次性传入存储过程,执行数据写入,不必在应用程序,遍历循环多次执行 Command。
使用示例
 CREATE PROCEDURE dbo.usp_CreateProduct(
CREATE PROCEDURE dbo.usp_CreateProduct( @ProductName varchar(100),
   @ProductName varchar(100), @UnitPrice money,
   @UnitPrice money, @CategoryIds varchar(4000),
   @CategoryIds varchar(4000), @ProductID int output
   @ProductID int output ) AS
) AS
 SET NOCOUNT ON
SET NOCOUNT ON
 -- 写入产品数据
-- 写入产品数据 INSERT Product(ProductName, UnitPrice)
INSERT Product(ProductName, UnitPrice) VALUE(@ProductName, @UnitPrice)
VALUE(@ProductName, @UnitPrice) -- 获取产品ID
-- 获取产品ID SELECT @ProductID = @@Identity
SELECT @ProductID = @@Identity
 -- 写入产品-种类关系表
-- 写入产品-种类关系表 -- 基于 INSERT INTO  SELECT 语法
-- 基于 INSERT INTO  SELECT 语法 INSERT INTO ProductCategoryShip(ProductID, CategoryID)
INSERT INTO ProductCategoryShip(ProductID, CategoryID) SELECT @ProductID, Value FROM dbo.uf_Util_SplitStr(@CategoryID, ',') -- 分隔产品种类ID
SELECT @ProductID, Value FROM dbo.uf_Util_SplitStr(@CategoryID, ',') -- 分隔产品种类ID
 SET NOCOUNT OFF
SET NOCOUNT OFF
自定义函数

 /*
/* * 字符串分割,结果作为表变量返回
 * 字符串分割,结果作为表变量返回 * 示例:
 * 示例:  *    SELECT Value FROM dbo.uf_Util_SplitStr('1,2,3,4,5,6', DEFAULT)
 *    SELECT Value FROM dbo.uf_Util_SplitStr('1,2,3,4,5,6', DEFAULT) *  SELECT Value FROM dbo.uf_Util_SplitStr('A;B;C;D;E;F', ';')
 *  SELECT Value FROM dbo.uf_Util_SplitStr('A;B;C;D;E;F', ';') */
*/ ALTER FUNCTION dbo.uf_Util_SplitStr(
ALTER FUNCTION dbo.uf_Util_SplitStr( @Src varchar(8000),
    @Src varchar(8000), @Separator varchar(10) = null
    @Separator varchar(10) = null )
) RETURNS @Result TABLE(VALUE varchar(100))
RETURNS @Result TABLE(VALUE varchar(100)) AS
AS BEGIN
BEGIN IF @Separator IS NULL
    IF @Separator IS NULL SET @Separator = ','
        SET @Separator = ',' 
         DECLARE @i int
    DECLARE @i int SET @Src = RTRIM(LTRIM(@Src))
    SET @Src = RTRIM(LTRIM(@Src)) SET @i = CHARINDEX(@Separator,@Src)
    SET @i = CHARINDEX(@Separator,@Src) WHILE @i>=1
    WHILE @i>=1 BEGIN
    BEGIN -- 插入新值
        -- 插入新值 INSERT @Result
        INSERT @Result  VALUES(LEFT(@Src, @i-1))
        VALUES(LEFT(@Src, @i-1)) 
         SET @Src = SUBSTRING(@Src, @i + 1, LEN(@Src) - @i)
        SET @Src = SUBSTRING(@Src, @i + 1, LEN(@Src) - @i) SET @i = CHARINDEX(@Separator, @Src)
        SET @i = CHARINDEX(@Separator, @Src) END
    END 
    IF @Src <> ''
    IF @Src <> ''  INSERT @Result
        INSERT @Result  VALUES(@Src)
        VALUES(@Src) 
    RETURN
   RETURN END
END 
                    
                     
                    
                 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号