2015-12-30 42 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