Esta é realmente uma duplicata dos links que você postou. Em vez de tentar analisar uma lista de valores, passe um parâmetro com valor de tabela.
Primeiro crie o tipo do parâmetro no banco de dados (apenas uma vez).
CREATE TYPE [dbo].[IdList] AS TABLE(
[Id] int NULL
);
Em seguida, crie um procedimento que aceite este parâmetro:
CREATE PROCEDURE [dbo].[GetWorkspaceMapDetailsForUserByGroups]
@workspaceID int,
@groupIds IdList READONLY
AS
BEGIN
SELECT
m.*
FROM GeoAppMapDef m
inner join @groupIds on [email protected]
WHERE
m.workspaceID = @workspaceID
and m.IsDeleted = 0
END
No lado do cliente, crie um DataTable com uma única coluna do tipo int chamada
Id
, preencha-o com os IDs desejados e use-o como o valor do @groupIds
parâmetro 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;
Copiei isso da pergunta duplicada com algumas modificações.