开发者社区 问答 正文

动态SQL -运行逗号分隔列表根据价值传递和返回行

我有这个表:

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

展开
收起
SONGYiiiD 2019-12-06 21:34:39 1523 分享 版权
阿里云 AI 助理回答

看起来你正在尝试从一个名为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 APPLYSTRING_SPLIT结合使用,可以为TL_TemplateLayout表中的每一行生成多行,每行对应原字符串中的一个数字。 3. 使用TRY_CAST来安全地将分割出来的文本转换为整数,这样即使有非数字字符也不会导致整个查询失败,而是简单地忽略这些非数字项。 4. 最后,直接在WHERE子句中比较转换后的值是否等于输入的索引值@index

请确保你的数据库版本支持STRING_SPLIT函数,这是SQL Server 2016及以上版本引入的功能。如果使用的是更早的版本,可能需要自定义函数来实现类似的功能。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
SQL
问答地址: