需要查询将列表传递给SQL Server中的存储过程

时间:2017-02-17 18:46:29

标签: c# sql-server entity-framework bulkinsert

我是sql server的新手,需要帮助创建一个查询,以便使用存储过程在一次调用中将所有数据插入到表中。 例如,我有1个用户(说" Tech"有Id 1)和客户列表(" C#"," ASP"," MVC&#34 )
。 我的表结构 Id(PK),
用户ID(FK)
客户varchar。

可接受的结果如
用户ID ---- | -----客户
1 ---------- | ----- C#
1 ---------- | ----- ASP
1 ---------- | ----- MVC

我会将userId和客户列表传递给我的SP。

1 个答案:

答案 0 :(得分:1)

这样做的一种方法如下。我假设您输入的格式为@ userId = 1,@ ListOfSubjects ='asp,c#'.. 这是示例proc。我们的想法是首先将列表od逗号分隔的字符串转换为表格,然后插入它。为此,我创建了一个示例UDF,它将以逗号分隔的字符串传递给它时重新调用表。

        create proc SampleUser_Insert 
         @UserId int , 
        @ListOfSubjects varchar(1000)
        as
        begin

             --set @UserId=1
             --set @ListOfSubjects ='asp,c#,mvc'


             declare @sampleTable table (userId int, subjects varchar(100))

             insert into    @sampleTable (userId,subjects )

             SELECT @userId, data FROM dbo.[SplitString](@ListOfSubjects, ',')
             select * from @sampleTable

        end

    --  exec SampleUser_Insert 1,'a,b,c'

udf如下

    CREATE FUNCTION [dbo].[SplitString]
    (
        @String NVARCHAR(4000),
        @Delimiter NCHAR(1)
    )
    RETURNS TABLE
    AS
    RETURN
    (
        WITH Split(stpos,endpos)
        AS(
            SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
            UNION ALL
            SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
                FROM Split
                WHERE endpos > 0
        )
        SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
            'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
        FROM Split
    )
    GO