将字符串列表传递给存储过程
Pass List of strings to a stored procedure
使用 SQL Server 2012,我想创建一个存储过程,传入一个字符串列表并检查每个 entry.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 中的字符串。我看过 Passing List<> to SQL Stored Procedure and C# SQL Server - Passing a list to a stored procedure,但仍然 none 更明智。任何帮助表示赞赏。
使用 XML 将逗号分隔值转换为 table。使用此更新程序。
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 ('<M>' + REPLACE(@viewMap, ',', '</M><M>') + '</M>' AS XML) AS CVS
) AS A CROSS APPLY CVS.nodes ('/M') AS Split(a)
)
这实际上是您发布的链接的副本。与其尝试解析值列表,不如传递一个 table 值参数。
首先在数据库中创建参数类型(仅一次)。
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 类型列的数据表,用您想要的 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;
我从重复的问题中复制了这个并做了一些修改。
使用 SQL Server 2012,我想创建一个存储过程,传入一个字符串列表并检查每个 entry.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 中的字符串。我看过 Passing List<> to SQL Stored Procedure and C# SQL Server - Passing a list to a stored procedure,但仍然 none 更明智。任何帮助表示赞赏。
使用 XML 将逗号分隔值转换为 table。使用此更新程序。
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 ('<M>' + REPLACE(@viewMap, ',', '</M><M>') + '</M>' AS XML) AS CVS
) AS A CROSS APPLY CVS.nodes ('/M') AS Split(a)
)
这实际上是您发布的链接的副本。与其尝试解析值列表,不如传递一个 table 值参数。
首先在数据库中创建参数类型(仅一次)。
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 类型列的数据表,用您想要的 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;
我从重复的问题中复制了这个并做了一些修改。