如何编写tsql请求(转换问题)?

如何编写tsql请求(转换问题)?,tsql,Tsql,我有两张桌子: 表合同: IdContract | Department | IdCompany ----------------------------------------------------- 154 | 6 | /1150/1420/879/ 和表公司: IdCompany | WorkingIdDepartment ------------------------------------- 11

我有两张桌子:

表合同:

IdContract     |  Department    |   IdCompany
-----------------------------------------------------
154            |   6            |   /1150/1420/879/
和表公司:

IdCompany    |   WorkingIdDepartment 
-------------------------------------
1150         |   /17/8/26/
出于某种原因,一些公司被错误地分配给了一些合同:他们是第6部门的合同,但他们只在第17、8和26部门工作。我需要找到那些公司

我尝试通过以下方式请求我的数据库:

SELECT * 
FROM tbl_contract ct, tbl_compagny cp
WHERE ct.IdCompany like CONCAT('%/1150/%')
AND ct.Department  NOT IN (17,8,26)
或者以动态的方式:

SELECT * 
FROM tbl_contract ct, tbl_compagny cp
WHERE ct.IdCompany like CONCAT('%/' , cp.IdCompany , '/%')
AND ct.Department  NOT IN (Right(Left(Replace(WorkingIdDepartment, '/', ','), len(Replace(WorkingIdDepartment, '/', ',')) - 1), len(Left(Replace(WorkingIdDepartment, '/', ','), len(Replace(WorkingIdDepartment, '/', ',')) - 1))-1))
但是我的错误是我请求的最后一部分,请给我一个字符串:“17,8,26”,而不是几个用coma分隔的Int。。。因此,我得到了转换错误(我不会在这里复制/粘贴我的错误,因为它是法语)

请问我怎样才能达到我的要求

感谢您的帮助!

解决方案是:

SELECT * 
FROM tbl_contract ct, tbl_compagny cp
WHERE ct.IdCompany like CONCAT('%/' , cp.IdCompany , '/%')
AND ct.Department NOT IN (SELECT value from STRING_SPLIT(WorkingIdDepartment, '/'))

这是非常“消耗性能”“但它适用于我的数据库糟糕的设计

看起来真正的问题在于你的设计。为什么要存储分隔数据?你应该把它修好。#我知道。。。这是一个将在2020年重新编写的旧应用程序,但遗憾的是,在此之前我必须处理它……这些值是分层的还是用作“安全”分隔符?你不能只是用
替换它,然后让
进入
运行<中的代码>可用于值列表,而不是看起来像列表的单个值。如果
/
只是一个分隔符,请在SQL Server 2016+中使用
字符串分割
,或多种字符串分割技术(如XML技术)中的一种,将这些值读取为行。如果值表示层次结构,则可以将其转换为
层次结构ID
,并轻松执行层次结构查询。但是,您发布的查询没有层次结构。您使用的是哪个SQL Server版本?即使使用
STRING\u SPLIT
查询也会很复杂-您需要将分隔的合同字段拆分为行,然后在ID值上与公司合并。