将字符串列表传递给存储过程

Joh*_*ohn -1 c# sql stored-procedures sql-server-2012

我想使用SQL Server 2012创建一个存储过程,该存储过程传入​​一个字符串列表并检查每个条目。Iv将列表添加到一个逗号分隔的字符串'UserGroupsAllowedToViewMap'中。这适用于一个条目,但是我需要检查它是否包含多个条目。

public DataTable GetMapsWithWorkspaceForUserGroups(int workspaceID, string UserGroupsAllowedToViewMap)
{
        DataTable mapDets = new DataTable();

        SqlCommand oComm = new SqlCommand();
        SqlParameter spParam_WrkSpaceId = new SqlParameter();
        SqlParameter spParam_ViewMap = new SqlParameter();
        SqlParameter[] spParams = new SqlParameter[2];

        SqlDataAdapter daUserMaps = new SqlDataAdapter();
        try
        {
            spParam_WrkSpaceId.ParameterName = "@workspaceID";
            spParam_WrkSpaceId.Value = workspaceID;
            spParams[0] = spParam_WrkSpaceId;

            spParam_ViewMap.ParameterName = "@ViewMap";
            spParam_ViewMap.Value = UserGroupsAllowedToViewMap;
            spParams[1] = spParam_ViewMap;

            oComm = CreateCommand("GetWorkspaceMapDetailsForUserByGroups", spParams, TypeOfConnectionString.GeoAppBuilder);
            daUserMaps.SelectCommand = oComm;
            daUserMaps.Fill(mapDets);
        }
        catch (Exception e)
        {
            throw (e);
        }
        finally
        {
            CloseConnection();
        }

        return mapDets;
}




  USE [App]
GO
/****** Object:  StoredProcedure [dbo].[GetWorkspaceMapDetailsForUserByGroups]    Script Date: 16/02/2015 10:37:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetWorkspaceMapDetailsForUserByGroups]   
    @workspaceID int,
    @viewMap nvarchar(256)
 AS 

SELECT 
  m.*
FROM 
  GeoAppMapDef m
WHERE
 m.workspaceID = @workspaceID
 and m.IsDeleted = 0
 and m.ViewMap = @viewMap
Run Code Online (Sandbox Code Playgroud)

我不确定如何遍历SQL中的字符串。香港专业教育学院看过传递列表<>到SQL存储过程C#SQL Server-传递列表到存储过程,但没有一个更明智。任何帮助表示赞赏。

Pan*_*vos 7

这实际上是您发布的链接的副本。与其尝试解析值列表,不如传递一个表值参数。

首先在数据库中创建参数的类型(仅一次)。

CREATE TYPE [dbo].[IdList] AS TABLE(
    [Id] int NULL
);
Run Code Online (Sandbox Code Playgroud)

然后创建一个接受此参数的过程:

CREATE PROCEDURE [dbo].[GetWorkspaceMapDetailsForUserByGroups]
    @workspaceID int,
    @groupIds IdList READONLY
AS
BEGIN
SELECT 
  m.*
FROM GeoAppMapDef m 
    inner join @groupIds on m.ViewMap=@groupIds.Id
WHERE
    m.workspaceID = @workspaceID
    and m.IsDeleted = 0
END
Run Code Online (Sandbox Code Playgroud)

在客户端,创建一个数据表,该数据表具有一个称为int的单一类型列Id,用所需的ID填充它,然后将其用作@groupIds参数的值

var table = new DataTable();
table.Columns.Add("Id", typeof(int));

for (int i = 0; i < 10; i++)
    table.Rows.Add(i);

var pList = new SqlParameter("@groupIds", SqlDbType.Structured);
pList.TypeName = "dbo.IdList";
pList.Value = table;
Run Code Online (Sandbox Code Playgroud)

我已经从重复问题中复制了此内容,并进行了一些修改。