sql-server-2008 - 如何在一次存储过程调用中将多条记录插入表中

标签 sql-server-2008 insert

我有一个存储过程,它接受 A、B、C...等字符串。我想拆分字符串并将每个字母作为一条记录插入表中。结果应该是:

col1 col2
1    A
2    B
3    C

我可以使用游标,但如果我从网页调用此存储过程,游标会有点慢。有没有更好的解决办法?

最佳答案

不要传递逗号分隔的字符串,而是传递表值参数。首先,在数据库中创建一个表类型:

CREATE TYPE dbo.Strings AS TABLE(String NVARCHAR(32));

然后你的存储过程:

CREATE PROCEDURE dbo.InsertStrings
  @Strings dbo.Strings READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.Table(Col2) -- assuming col1 is an IDENTITY column?
    SELECT String FROM @Strings;
END
GO

然后在您的 C# 代码或其他代码中,您只需将 DataTable 作为 Structured 参数传递即可。 Example herebackground here .

如果你真的不想这样做,因为它太难或其他原因,那么你可以使用效率低得多的字符串分割函数,例如

CREATE FUNCTION [dbo].[SplitString]
(
    @List NVARCHAR(MAX),
    @Delim VARCHAR(255)
)
RETURNS TABLE
AS
    RETURN ( SELECT [Value] FROM 
      ( 
        SELECT 
          [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
          CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
        FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
          FROM sys.all_objects) AS x
          WHERE Number <= LEN(@List)
          AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
      ) AS y
    );

那么你的程序是:

CREATE PROCEDURE dbo.InsertStrings
  @Strings NVARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.Table(Col2) -- assuming col1 is an IDENTITY column?
    SELECT [Value] FROM dbo.SplitString(@Strings, ',');
END
GO

关于sql-server-2008 - 如何在一次存储过程调用中将多条记录插入表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20477373/

相关文章:

sql - 如何开始创建和使用数据库?

不使用循环的 SQL Server 查询

sql - 如何转换 hh :mm:ss to seconds in SQL Server with more than 24 hours

c# - 存储过程输出参数返回舍入值

带有选择查询的postgresql多重插入

mysql - MySQL 5.6 触发器性能低下

sql-server-2008 - 将日期时间值插入到 sql server 表列中

php - Mysql从XML插入字段名称为 "hyphen"

mysql - 尝试使用 MySQL 避免使用预准备语句进行子查询

ios - 值在数据库中插入两次