我有这个表:
TL_TCT_Id 3,8 3,4 3,8 3,8 3,8 3,8 3,8 3,8 TL_TCT_Id字符串(nvarchar (100))
我有这个脚本,通过让说拿出8但没有结果
ALTER PROCEDURE [dbo].[spGetComponentByIndex] @index int AS BEGIN
WITH temporaryTable as (SELECT ('''' + replace(TL_TCT_Id, ',', ''',''') + '''') as [TCT] FROM TL_TemplateLayout)
select * from temporaryTable t where cast(8 as nvarchar) in (t.TCT)
END
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
看起来你正在尝试从一个名为TL_TemplateLayout
的表中,根据逗号分隔的字符串列TL_TCT_Id
筛选出包含特定值(例如8)的行。你的存储过程设计了一个临时表来处理这个任务,但是目前的实现似乎没有达到预期的效果。
问题可能在于你如何构造临时表中的TCT字段以及如何进行后续的IN查询。这里是一个修改后的版本,可能会帮助你解决问题:
ALTER PROCEDURE [dbo].[spGetComponentByIndex] @index int AS
BEGIN
-- 使用STRING_SPLIT函数将TL_TCT_Id的每个值分割成行
WITH SplitTable AS (
SELECT
TL_TCT_Id,
value
FROM
TL_TemplateLayout
CROSS APPLY STRING_SPLIT(TL_TCT_Id, ',') -- 注意:STRING_SPLIT函数在SQL Server 2016及以后版本可用
)
-- 直接比较分割后的值与@index
SELECT
TL_TCT_Id
FROM
SplitTable
WHERE
TRY_CAST(value AS INT) = @index; -- 尝试将value转换为INT并与@index比较
END
这个修改版做了以下几点调整: 1. 使用了STRING_SPLIT
函数来直接将TL_TCT_Id
列的每个逗号分隔的值拆分成单独的行,这使得后续的筛选更加直接和高效。 2. 通过CROSS APPLY
与STRING_SPLIT
结合使用,可以为TL_TemplateLayout
表中的每一行生成多行,每行对应原字符串中的一个数字。 3. 使用TRY_CAST
来安全地将分割出来的文本转换为整数,这样即使有非数字字符也不会导致整个查询失败,而是简单地忽略这些非数字项。 4. 最后,直接在WHERE子句中比较转换后的值是否等于输入的索引值@index
。
请确保你的数据库版本支持STRING_SPLIT
函数,这是SQL Server 2016及以上版本引入的功能。如果使用的是更早的版本,可能需要自定义函数来实现类似的功能。