【问题标题】:Insert list of values into a SQL Server table with stored procedure使用存储过程将值列表插入到 SQL Server 表中
【发布时间】:2014-07-27 08:17:00
【问题描述】:

如何将列数据列表传递到存储过程中?

我的存储过程是

ALTER PROCEDURE [dbo].[Register]
    @Id        int,
    @Name nvarchar(50)
AS
BEGIN
    BEGIN TRY
        INSERT INTO dbo.Group (Id, Name) 
        VALUES(@Id, @Name)

        SELECT 0
    END TRY
    BEGIN CATCH
        SELECT -1
    END CATCH
END
GO

我想传递这样的数据以插入到这个表中

@Id = 1,2,3,4,5 
@Name = 'test1,test2,test3,test4,test5'

这样的结果

Id   Name
1    test1
2    test2
3    test3
4    test4
5    test5

【问题讨论】:

    标签: c# asp.net sql sql-server stored-procedures


    【解决方案1】:

    SQL Server 中的“列表”或“数组”是......一个。因此,如果您使用的是 SQL Server 2008 或更新版本(您没有指定),请使用 SQL Server 的 表值参数 功能来传递值表到你的存储过程

    -- Create a table type to match your input parameters
    CREATE TYPE IdNameTable AS TABLE 
    ( ID INT, Name NVARCHAR(50) );
    GO
    
    -- change your stored procedure to accept such a table type parameter
    ALTER PROCEDURE [dbo].[Register]
        @Values IdNameTable READONLY
    AS
    BEGIN
        BEGIN TRY
            INSERT INTO dbo.Group (Id, Name) 
              -- get the values from the table type parameter
              SELECT 
                 Id, Name
              FROM
                 @Values
    
            SELECT 0
        END TRY
        BEGIN CATCH
            SELECT -1
        END CATCH
    END
    GO
    

    请参阅广泛且免费的SQL Server Books Online documentation,了解有关表值参数功能及其使用方法的更多详细信息

    如果您想在 T-SQL 中使用它,请使用以下代码:

    -- declare a variable of that table type
    DECLARE @InputTable IdNameTable
    
    -- insert values into that table variable
    INSERT INTO @InputTable(ID, Name) 
    VALUES (1, 'Test 1'), (2, 'Test 2')
    
    -- execute your stored procedure with this table as input parameter
    EXECUTE [dbo].[Register] @InputTable
    

    如果您想在 C# 或 VB.NET 中使用它,请参阅 Michael Edenfield 在 cmets 中的链接。

    【讨论】:

    • 如果您更新如何将数据传递给过程参数,将会很有帮助...
    • @marc_s 谢谢veryyyy veryyy,但有一个问题。我如何使用 exec 存储过程?传递价值?在我运行此存储过程并想要更改它之后,我收到此错误,他键入“IdNameTable”已经存在,或者您没有创建它的权限。请帮帮我
    • @user3807529:我添加了代码来展示如何从 T-SQL 使用它 - 如果你想从 C# 或 VB.NET 使用它,请参阅 Michael 在 cmets$ 中发布的链接
    • @marc_s 谢谢,但我无法在 Visual Studio2015 中将 sp 拖到 dbml 中!?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多