【问题标题】:Inserting multiple rows through a variable通过变量插入多行
【发布时间】:2015-12-30 05:46:11
【问题描述】:

实际上我想在一个表中插入多行。 表的结构是

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

我怎样才能做到这一点?

【问题讨论】:

    标签: sql sql-server sql-insert


    【解决方案1】:

    使用动态 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')
    

    如果可能,请选择上述之一,而不是最初提到的动态选项。

    【讨论】:

    • 谢谢@lock,但是我如何在一个执行方法中执行两个 sql 语句,或者我应该使用两个执行方法,如 execute(@sql);并执行(@sql1)
    • 推荐连接形成 SQL 查询真的是个好主意吗?我的意思是,它在这个简单的示例中有效,但它已经需要引用杂耍(2 个字符串 10 个引号!),并且如果 s 来自串联本身,它可能会分解已经包含引号的任何值。
    • 这不是我会做的事情。我会避免使用动态 sql,但是问题显示了一个变量已经将两行作为字符串,所以我的回答是基于数据可能正在获取的假设以这种方式从可能超出操作控制的另一个系统传递。
    【解决方案2】:
    insert into tbl_username(username)values ('name1'),('name2'),.....;
    

    这里因为 username 是 varchar 类型,所以它将 @s 视为单个值并将其插入一行。

    【讨论】:

    • @RajaYuvi 对,这是另一种方式。这里不需要准备两个单独的查询字符串然后执行。
    • @RajaYuvi:请备份此声明。当 Lock 对 SQL 注入开放并且需要摆弄引号时,Lock 的答案如何更好?
    【解决方案3】:

    以下逻辑使用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)-@Position)
        END
    
    INSERT INTO tbl_username 
        Select @s
    
    SELECT * FROM tbl_username
    

    请尝试:http://sqlfiddle.com/#!6/d0f76/1/0

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      相关资源
      最近更新 更多