日期:2014-05-16  浏览次数:20500 次

给定id序列,最简方式给这些id插入记录
有个tableA,有个id字段(非主键)。
存储过程传入一个以逗号分割的id序列字符串参数,在存储过程中要在tableA给序列中的每个id插入一条记录(其它字段值不用考虑)。
请教最简单实现方法。
------解决方案--------------------

create table tableA
(
    id        int      --非主键字段
) go;

create procedure toinserttb(@strID varchar(1000))    --@strID    '1,2,3,4'
as
begin
declare @str varchar(8000)
set @str = 'insert into tableA(id) '
set @str = @str + ' select ' + replace(@strID,',',' union all select ')
exec(@str)
end
go

exec toinserttb '1,2,3,4'

------解决方案--------------------
--1. 创建fn_Split函数. ( 切分字符串, 返回一个列名为id的表 )  
IF EXISTS(
       SELECT *
       FROM   dbo.sysobjects
       WHERE  id = OBJECT_ID('fn_Split')
              AND (TYPE = 'FN' OR TYPE = 'TF' OR TYPE = 'IF')
   )
    DROP FUNCTION fn_Split  
GO  
  
CREATE FUNCTION [dbo].[fn_Split]
(
@str           VARCHAR(MAX),
@separator     VARCHAR(10)
)
RETURNS TABLE
AS
RETURN 
(
    --Example:  SELECT id FROM fn_Split('a,b,d,c',',')  
    SELECT B.id
    FROM   (
               (
                   --A 的作用只是生成 '<v>a</v><v>b</v><v>d</v><v>c</v>' 的XML格式的数据, 提供数据源 
                   SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')
               ) A 
               OUTER APPLY
               (
                   --B 的作用是将A中的 XML 数据的值枚举出来转换成行
                   SELECT id = N.v.value('.', 'varchar(100)') FROM   A.[value].nodes('/v') N(v)
               ) B
           )
)
GO
--测试表
IF OBJECT_ID('test_t') IS NOT NULL
DROP TABLE test_t
GO
CREATE TABLE test_t (
pkId INT IDENTITY(1,1) ,
id INT,