Sql 使用ID时转换失败";其中,(…)中的ID“;,nvarchar到int

Sql 使用ID时转换失败";其中,(…)中的ID“;,nvarchar到int,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在MSSQL 2008中有一个查询,如: IF OBJECT_Id('tempdb..#AccessibleFacilities') IS NOT NULL DROP TABLE #AccessibleFacilities SELECT u.Userid , AccesibleFacilityIds = dbo.GetCommaDelimitedString(upf.Facility_Id) INTO #AccessibleFacilities FROM Users u I

我在MSSQL 2008中有一个查询,如:

IF OBJECT_Id('tempdb..#AccessibleFacilities') IS NOT NULL DROP TABLE #AccessibleFacilities
SELECT u.Userid
     , AccesibleFacilityIds = dbo.GetCommaDelimitedString(upf.Facility_Id)  
INTO #AccessibleFacilities   
FROM Users u
INNER join UserProfileFacilities upf on upf.UserProfile_Id = up.Id  
WHERE LOWER(u.Userid) = LOWER(@userId)
GROUP BY u.Userid
此查询返回可访问的FacilityId,如
“,1,2,3,4,5,6,”
。请注意,我无法修改GetCommaDelimitedString函数

我实际上需要做的是,使用这些设施ID访问PROV,如下所示:

INSERT INTO #AccessibleProvs
    SELECT Userid = @userId
         , AccessibleProvIds = dbo.GetCommaDelimitedString(distinct p.Id) 
    FROM Provs p 
         inner join ProvFacs pf on p.Id = pf.Provider_Id
    WHERE pf.Facility_Id in 
          (select a.AccesibleFacilityIds from #AccessibleFacilities a) 
但是,它给了我一个错误,如:

转换nvarchar值“1,2,3,4,5,6”时转换失败 到数据类型int

我尝试删除开头和结尾的逗号符号,如下图所示,以修复该问题,但没有任何帮助:

...
where pf.Facility_Id in (
      select SUBSTRING(a.AccesibleFacilityIds,2,LEN(a.AccesibleFacilityIds)-2) 
      from #AccessibleFacilities a
     )

如有任何建议,将不胜感激。谢谢。

与其将
Facility\u Id
转换为逗号分隔的字符串,为什么不将其保留为临时表中的可用列

if object_Id('tempdb..#AccessibleFacilities') is not null drop table #AccessibleFacilities;
select 
    u.UserId
  , upf.Facility_Id
into #AccessibleFacilities
from Users u
  inner join UserProfileFacilities upf 
    on upf.UserProfile_Id = up.Id  
然后使用它,就像使用()中的
存在()
一样:


如果您在开始时有
@UserId
的值,则可以将临时表的使用限制为只使用您需要的用户。希望这段代码不是为了在某种游标或其他循环中使用

请出示样品数据。在查询中使用CSV字符串通常会有一种不好的味道。由于您不能修改逗号字符串函数,您能创建一个新的吗?这比解析和替换操作要好得多。列中的CSV通常是设计不佳的标志。
insert into #AccessibleProvs
select 
    UserId = @userId
  , AccessibleProvIds = dbo.GetCommaDelimitedString(distinct p.Id) 
from Provs p 
  inner join ProvFacs pf 
    on p.Id = pf.Provider_Id
where exists (
   select 1
   from #AccessibleFacilities a
   where a.Facility_Id = pf.Facility_Id
     --and a.UserId = @UserId -- Do you need to check Facility_Id by User?
   )