在存储过程中拆分后生成插入语句

时间:2013-02-15 08:00:07

标签: sql sql-server-2008 stored-procedures

我有一个存储过程,它接受VARCHAR(MAX)类型的参数。该参数的字符串由逗号分隔,如

@test = 'test123,test456,test789';

基于该参数,我想生成多个插入语句。

我将使用此问题中定义的分割函数:Split string by comma in SQL Server 2008

您能告诉我一个如何在用逗号分割字符串后生成插入的示例吗?

逻辑步骤应该是:

@test = 'test123,test456,test789';
split @test
use while or cursor ? (I don't know)
INSERT INTO X values ('test123')
INSERT INTO X values ('test456')
...

4 个答案:

答案 0 :(得分:2)

DECLARE @id VARCHAR(MAX)

SET @id = 'test123,test456,test789,'

WHILE CHARINDEX(',', @id) > 0 
BEGIN

DECLARE @tmpstr VARCHAR(50)
 SET @tmpstr = SUBSTRING(@id, 1, ( CHARINDEX(',', @id) - 1 ))

INSERT  INTO X

VALUES  ( 
          @tmpstr
        )
SET @id = SUBSTRING(@id, CHARINDEX(',', @id) + 1, LEN(@id))
END

答案 1 :(得分:1)

尝试以下它会帮助你...

在这里,您不需要任何用户定义的功能....您只需使用以下代码并获得结果......

DECLARE @test NVARCHAR(MAX)
SET @test = 'test123,test456,test789'
SET @test = ',' + @test + ','
DECLARE @Part NVARCHAR(MAX)
DECLARE @INDEX    INT
SET @INDEX = CHARINDEX(',',@test)
DECLARE @EIND INT set @EIND = 0

WHILE(@INDEX != LEN(@test))
BEGIN
    SET  @EIND = ISNULL(((CHARINDEX(',', @test, @INDEX + 1)) - @INDEX - 1), 0)

    INSERT INTO X SELECT (SUBSTRING(@test, (@INDEX  + 1),  @EIND)) -- Insert Comes Here

    SELECT @INDEX = ISNULL(CHARINDEX(',', @test, @INDEX + 1), 0)
END

答案 2 :(得分:0)

您可以动态地动态创建SQL语句,然后运行该命令。实际上循环它不是必须的。此脚本在一个INSERT语句中提供多个插入

DECLARE @test nvarchar(100) = 'test123,test456,test789';  
DECLARE @dml nvarchar(max) = N''
SET @dml = 'INSERT [dbo].[test2] VALUES' + '(''' + REPLACE(@test, ',', '''),(''') + ''')'
EXEC sp_executesql @dml

此外,您还可以使用动态管理功能选项sys.dm_fts_parser

SELECT FULLTEXTSERVICEPROPERTY ('IsFulltextInstalled')

0 =未安装全文。 1 =已安装全文。 NULL =输入无效或错误。

如果0 =未安装全文,则此帖子对您How to install fulltext on sql server 2008?

是必要的
DECLARE @test nvarchar(100) = 'test123,test456,test789';
INSERT [dbo].[test2]
SELECT display_term
FROM sys.dm_fts_parser('"' + @test + '"', 1033, NULL, 0)

答案 3 :(得分:-1)

此查询将拆分字符串,然后循环结果以构造插入注释。

declare @test varchar(30) = 'test123,test456,test789';

-- retrieve number of comma(s) in @test
declare @i int = len(@test) - len(replace(@test,',','')) + 1
declare @cmd nvarchar(255)

-- loop
while @i >= 0
begin
    select @cmd = 'INSERT INTO X VALUES (''' +  parsename(replace(@test, ',', '.'), @i) + ''');';
    -- execute sql
    exec sp_executesql @cmd
    set @i = @i - 1
end