2015-12-30 70 views
4

其實我想插入多行到表。 表的結構通過變量插入多行

Create Table tbl_username 
(id int autoincrement, 
username varchar(100), 
Primary key(id)) 

,我試圖插入像

Declare @s as varchar(100) 
set @s='(''name1''),(''name2'')' 
insert into tbl_username(username)values @s; 

多行,但是我得到的輸出

id  username 
1   (''name1''),(''name2'') 

其實我所需要的輸出

id   username 
1   name1 
2   name2 

我該如何做到這一點?

回答

6

使用動態SQL

Declare @s as varchar(100) 
Declare @sql as varchar(max) 
set @s='(''name1''),(''name2'')' 
set @sql = 'insert into tbl_username(username) values ' + @s; 

execute(@sql); 

不過我會避免動態SQL在可能的情況。 這樣做,如果你的價值觀是不是在一個變量的標準方法是:

INSERT INTO tbl_username(username) values ('name1'),('name2') 

或者

INSERT INTO tbl_username(username) values ('name1') 
INSERT INTO tbl_username(username) values ('name2') 

如果可能的話,選擇上面,而不是最初提到的動態選項之一。

+0

感謝@Lock但我怎麼能執行兩個SQL語句的執行方法,或者我應該用兩個執行類似的方法執行(@sql);並執行(@sql1) –

+0

是否推薦連接以形成SQL查詢確實是一個好主意?我的意思是,它在這個簡單化的例子中起作用,但它已經需要報價雜耍(2個字符串10個引號!),並且如果「s」來自串接本身,那麼它很可能會破壞任何已包括報價的值。 –

+0

這不是我將如何做到這一點..我會避免動態SQL但是問題顯示一個變量已經與兩行作爲一個字符串,所以我的答案是基於一個假設,也許數據正在從另一個系統以這種方式傳遞可能在操作控制之外。 – Lock

4
insert into tbl_username(username)values ('name1'),('name2'),.....; 

這裏,因爲用戶名是varchar類型,因此它正在考慮@s單值和一個行插入。

+0

@RajaYuvi對,這是做這件事的另一種方式。沒有必要在這裏準備兩個單獨的查詢字符串,然後執行。 – Mukund

+0

@RajaYuvi:請備份此聲明。 Lock開放SQL注入時如何更好地回答問題,並且需要引號處理? –

2

以下邏輯利用的substring特點:

DECLARE @s as varchar(100), @Delimiter VARCHAR(1) 

SET @s = 'name1,name2' 
SET @Delimiter = ',' 

DECLARE @Position INT, @ListItem VARCHAR(MAX) 

WHILE CHARINDEX(@Delimiter, @s) > 0 
    BEGIN 
     SELECT @Position = CHARINDEX(@Delimiter, @s) 
     SELECT @ListItem = SUBSTRING(@s, 1, @Position-1) 

     INSERT INTO tbl_username 
      SELECT @ListItem 

     SELECT @s = SUBSTRING(@s, @Position+1, LEN(@s)[email protected]) 
    END 

INSERT INTO tbl_username 
    Select @s 

SELECT * FROM tbl_username 

請嘗試:http://sqlfiddle.com/#!6/d0f76/1/0