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

使用,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 

我不确定如何在SQL中迭代字符串。 我看过传递列表到SQL存储过程和C#SQL Server – 将列表传递给存储过程但仍然没有更聪明。 任何帮助赞赏。

使用XML将逗号分隔值转换为表。 使用此更新程序。

 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 IN ( SELECT Split.a.value('.', 'VARCHAR(100)') AS CVS FROM ( SELECT CAST ('' + REPLACE(@viewMap, ',', '') + '' AS XML) AS CVS ) AS A CROSS APPLY CVS.nodes ('/M') AS Split(a) ) 

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

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

 CREATE TYPE [dbo].[IdList] AS TABLE( [Id] int NULL ); 

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

 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 

在客户端,使用一个名为Id int类型列创建一个DataTable,用您想要的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; 

我通过一些修改从复制的问题中复制了这个。