2013-02-15 141 views
1

我有一個存儲過程,它接受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') 
... 

回答

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 
0

您可以動態動態創建一個SQL語句,然後運行該command.Actually循環,沒有必要給你。這個腳本在一個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) 
-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 
+2

如果列表中項目的數量超過四個,則將失敗。 – 2013-02-15 08:25:36

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